ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Windows/cdenable/ntcd.cpp
Revision: 1.4
Committed: 2008-01-01T09:40:34Z (16 years, 11 months ago) by gbeauche
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +1 -1 lines
Log Message:
Happy New Year!

File Contents

# User Rev Content
1 gbeauche 1.1 /*
2     * ntcd.cpp - Interface to cdenable.sys driver
3     *
4 gbeauche 1.4 * Basilisk II (C) 1997-2008 Christian Bauer
5 gbeauche 1.1 *
6     * Windows platform specific code copyright (C) Lauri Pesonen
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21     */
22    
23     #include "sysdeps.h"
24     #include <windows.h>
25    
26     extern "C" {
27    
28     #include <winioctl.h>
29     #include <winsvc.h>
30     #include "ntcd.h"
31     #include "cdenable.h"
32    
33     static char *sDriverShort = "cdenable";
34     static char *sDriverLong = "System32\\Drivers\\cdenable.sys";
35     static char *sCompleteName = "\\\\.\\cdenable";
36    
37     #ifdef _DEBUG
38     #define new DEBUG_NEW
39     #undef THIS_FILE
40     static char THIS_FILE[] = __FILE__;
41     #endif
42    
43     // Start type must be SERVICE_AUTO_START or lower, in order
44     // it to start automatically and allow the mechanism work
45     // for users with no admin rights.
46     static BOOL InstallDriver(
47     IN SC_HANDLE SchSCManager,
48     IN LPCTSTR DriverName,
49     IN LPCTSTR ServiceExe
50     )
51     {
52     SC_HANDLE schService;
53     DWORD err;
54    
55     schService = CreateService (
56     SchSCManager, // SCManager database
57     DriverName, // name of service
58     DriverName, // name to display
59     SERVICE_ALL_ACCESS, // desired access
60     SERVICE_KERNEL_DRIVER, // service type
61     SERVICE_AUTO_START, // SERVICE_DEMAND_START, // start type
62     SERVICE_ERROR_NORMAL, // error control type
63     ServiceExe, // service's binary
64     NULL, // no load ordering group
65     NULL, // no tag identifier
66     NULL, // no dependencies
67     NULL, // LocalSystem account
68     NULL // no password
69     );
70    
71     if (schService == NULL) {
72     err = GetLastError();
73     if (err == ERROR_SERVICE_EXISTS) {
74     return TRUE;
75     } else {
76     return FALSE;
77     }
78     }
79     CloseServiceHandle (schService);
80     return TRUE;
81     }
82    
83     static BOOL RemoveDriver(
84     IN SC_HANDLE SchSCManager,
85     IN LPCTSTR DriverName
86     )
87     {
88     SC_HANDLE schService;
89     BOOL ret;
90    
91     schService = OpenService (SchSCManager,
92     DriverName,
93     SERVICE_ALL_ACCESS
94     );
95     if (schService == NULL) return FALSE;
96     ret = DeleteService (schService);
97     CloseServiceHandle (schService);
98     return ret;
99     }
100    
101     static BOOL StartDriver(
102     IN SC_HANDLE SchSCManager,
103     IN LPCTSTR DriverName
104     ) {
105     SC_HANDLE schService;
106     BOOL ret;
107     DWORD err;
108    
109     schService = OpenService (SchSCManager,
110     DriverName,
111     SERVICE_ALL_ACCESS
112     );
113     if (schService == NULL) return FALSE;
114     ret = StartService (schService, // service identifier
115     0, // number of arguments
116     NULL // pointer to arguments
117     );
118     if(ret == 0) {
119     err = GetLastError();
120     if (err == ERROR_SERVICE_ALREADY_RUNNING) {
121     ret = TRUE;
122     } else {
123     ret = FALSE;
124     }
125     }
126     CloseServiceHandle (schService);
127     return ret;
128     }
129    
130     static BOOL StopDriver(
131     IN SC_HANDLE SchSCManager,
132     IN LPCTSTR DriverName
133     )
134     {
135     SC_HANDLE schService;
136     BOOL ret;
137     SERVICE_STATUS serviceStatus;
138    
139     schService = OpenService (SchSCManager,
140     DriverName,
141     SERVICE_ALL_ACCESS
142     );
143     if (schService == NULL) return FALSE;
144     ret = ControlService (schService,
145     SERVICE_CONTROL_STOP,
146     &serviceStatus
147     );
148     CloseServiceHandle (schService);
149     return ret;
150     }
151    
152     static BOOL __cdecl start_driver( void )
153     {
154     SC_HANDLE schSCManager;
155     BOOL ret = FALSE;
156    
157     schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
158     if(!schSCManager) return(FALSE);
159     if(!InstallDriver( schSCManager, sDriverShort, sDriverLong )) {
160     CloseServiceHandle( schSCManager );
161     return(FALSE);
162     }
163     ret = StartDriver( schSCManager, sDriverShort );
164     if(!ret) {
165     (void)RemoveDriver( schSCManager, sDriverShort );
166     }
167     CloseServiceHandle( schSCManager );
168     return( ret );
169     }
170    
171     static BOOL __cdecl stop_driver( void )
172     {
173     SC_HANDLE schSCManager;
174     BOOL ret = FALSE;
175    
176     schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
177     if(!schSCManager) return(FALSE);
178     if(StopDriver( schSCManager, sDriverShort )) ret = TRUE;
179     CloseServiceHandle( schSCManager );
180     return( ret );
181     }
182    
183     static BOOL __cdecl remove_driver( void )
184     {
185     SC_HANDLE schSCManager;
186     BOOL ret = FALSE;
187    
188     schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
189     if(!schSCManager) return(FALSE);
190     if(RemoveDriver( schSCManager, sDriverShort )) ret = TRUE;
191     CloseServiceHandle( schSCManager );
192     return( ret );
193     }
194    
195    
196    
197     // Exported stuff begins
198    
199     int CdenableSysReadCdBytes( HANDLE h, DWORD start, DWORD count, char *buf )
200     {
201     HANDLE hDevice;
202     int ret;
203     DWORD nb;
204     DWORD in_buffer[10];
205     DWORD out_buffer[10];
206    
207     ret = 0;
208    
209     in_buffer[0] = (DWORD)h;
210     in_buffer[1] = (DWORD)start;
211     in_buffer[2] = (DWORD)count;
212     in_buffer[3] = (DWORD)buf;
213     out_buffer[0] = 0;
214    
215     hDevice = CreateFile (sCompleteName,
216     GENERIC_READ | GENERIC_WRITE,
217     0,
218     NULL,
219     OPEN_EXISTING,
220     FILE_ATTRIBUTE_NORMAL,
221     NULL
222     );
223    
224     if (hDevice == ((HANDLE)-1)) {
225     ret = 0;
226     } else {
227     if ( DeviceIoControl( hDevice,
228     IOCTL_CDENABLE_READ,
229     (LPVOID)in_buffer, 16,
230     (LPVOID)out_buffer, 4,
231     &nb, NULL ) )
232     {
233     if(out_buffer[0] != 0) ret = count;
234     }
235     CloseHandle (hDevice);
236     }
237    
238     return ret;
239     }
240    
241     int CdenableSysReadCdSectors( HANDLE h, DWORD start, DWORD count, char *buf )
242     {
243     return( CdenableSysReadCdBytes( h, (start<<11), (count<<11), buf ) );
244     }
245    
246     int CdenableSysWriteCdBytes( HANDLE h, DWORD start, DWORD count, char *buf )
247     {
248     return( 0 );
249    
250     /*
251     HANDLE hDevice;
252     int ret;
253     DWORD nb;
254     DWORD in_buffer[10];
255     DWORD out_buffer[10];
256    
257     ret = 0;
258    
259     in_buffer[0] = (DWORD)h;
260     in_buffer[1] = (DWORD)start;
261     in_buffer[2] = (DWORD)count;
262     in_buffer[3] = (DWORD)buf;
263     out_buffer[0] = 0;
264    
265     hDevice = CreateFile (sCompleteName,
266     GENERIC_READ | GENERIC_WRITE,
267     0,
268     NULL,
269     OPEN_EXISTING,
270     FILE_ATTRIBUTE_NORMAL,
271     NULL
272     );
273    
274     if (hDevice == ((HANDLE)-1)) {
275     ret = 0;
276     } else {
277     if ( DeviceIoControl( hDevice,
278     IOCTL_CDENABLE_WRITE,
279     (LPVOID)in_buffer, 16,
280     (LPVOID)out_buffer, 4,
281     &nb, NULL ) )
282     {
283     if(out_buffer[0] != 0) ret = count;
284     }
285     CloseHandle (hDevice);
286     }
287    
288     return ret;
289     */
290     }
291    
292     int CdenableSysWriteCdSectors( HANDLE h, DWORD start, DWORD count, char *buf )
293     {
294     // return( CdenableSysWriteCdBytes( h, (start<<11), (count<<11), buf ) );
295     return( 0 );
296     }
297    
298     BOOL CdenableSysInstallStart(void)
299     {
300     return(start_driver());
301     }
302    
303     void CdenableSysStopRemove(void)
304     {
305     stop_driver();
306     remove_driver();
307     }
308    
309     DWORD CdenableSysGetVersion( void )
310     {
311     HANDLE hDevice;
312     DWORD ret;
313     DWORD nb;
314     DWORD out_buffer[10];
315    
316     ret = 0;
317     out_buffer[0] = 0;
318     hDevice = CreateFile (sCompleteName,
319     GENERIC_READ | GENERIC_WRITE,
320     0,
321     NULL,
322     OPEN_EXISTING,
323     FILE_ATTRIBUTE_NORMAL,
324     NULL
325     );
326     if (hDevice == ((HANDLE)-1)) {
327     ret = 0;
328     } else {
329     if ( DeviceIoControl( hDevice,
330     IOCTL_CDENABLE_GET_VERSION,
331     NULL, 0,
332     (LPVOID)out_buffer, 4,
333     &nb, NULL ) )
334     {
335     ret = out_buffer[0];
336     }
337     CloseHandle (hDevice);
338     }
339     return ret;
340     }
341    
342     #ifdef __cplusplus
343     } //extern "C"
344     #endif
345