/[winpt]/trunk/PTD/wptFileDisk.cpp
ViewVC logotype

Annotation of /trunk/PTD/wptFileDisk.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (hide annotations)
Fri Oct 28 12:57:05 2005 UTC (19 years, 4 months ago) by werner
File size: 8898 byte(s)
Second set of changes to use autotools for building.
1 werner 46 #if 0
2     filedisk_init_info @600
3     filedisk_free_info @601
4     filedisk_mount @602
5     filedisk_unmount @603
6     filedisk_status @604
7    
8     /* wptFileDisk.c - Control program for a virtual disk driver for WinNT/2000/XP.
9    
10     Copyright (C) 1999, 2000, 2001, 2002 Bo BrantĂ©n.
11    
12     Heavily modified for the use with Cryptdisk by Timo Schulz
13     (C) 2004 Timo Schulz
14    
15     This program is free software; you can redistribute it and/or modify
16     it under the terms of the GNU General Public License as published by
17     the Free Software Foundation; either version 2 of the License, or
18     (at your option) any later version.
19     This program is distributed in the hope that it will be useful,
20     but WITHOUT ANY WARRANTY; without even the implied warranty of
21     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22     GNU General Public License for more details.
23     You should have received a copy of the GNU General Public License
24     along with this program; if not, write to the Free Software
25     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26     */
27    
28     #ifdef HAVE_CONFIG_H
29     #include <config.h>
30     #endif
31    
32     #include <windows.h>
33     #include <windows.h>
34     #include <winioctl.h>
35     #include <stdio.h>
36     #include <sys/types.h>
37    
38     #include "openpgp.h"
39     #include "../Include/wptCryptdisk.h"
40    
41     /* remember to change the values in wptErrors.h also */
42     #define CDISK_ERR_LOCK 201
43     #define CDISK_ERR_MOUNT 202
44     #define CDISK_ERR_UMOUNT 203
45     #define CDISK_ERR_OPEN 204
46     #define CDISK_ERR_BUSY 205
47     #define CDISK_ERR_QUERY 206
48    
49     static void
50     print_lasterr (char * prefix)
51     {
52     LPVOID msg;
53    
54     FormatMessage(
55     FORMAT_MESSAGE_ALLOCATE_BUFFER |
56     FORMAT_MESSAGE_FROM_SYSTEM |
57     FORMAT_MESSAGE_IGNORE_INSERTS,
58     NULL,
59     GetLastError(),
60     0,
61     (LPTSTR) &msg,
62     0,
63     NULL
64     );
65     MessageBox (NULL, (LPTSTR)msg, prefix, MB_ICONERROR|MB_OK);
66     LocalFree (msg);
67     }
68    
69     #if 0
70     static int
71     add_key (OPEN_FILE_INFORMATION *ka, const char * key, size_t len)
72     {
73     gpg_md_t md=NULL;
74    
75     if (ka->KeyNum >= MAX_KEYS)
76     return -1;
77    
78     switch (ka->KeyType) {
79     case 1: /* 2fish */
80     md = gpg_md_open (MD_RMD160);
81     ka->KeyLength=20;
82     break;
83     case 2: /* AES256 */
84     md = gpg_md_open (MD_SHA512);
85     ka->KeyLength=32;
86     break;
87     case 3: /* AES128 */
88     md = gpg_md_open (MD_SHA256);
89     ka->KeyLength=16;
90     break;
91     case 4: /* AES192 */
92     ka->KeyLength=24;
93     md = gpg_md_open (MD_SHA384);
94     break;
95     }
96     if (!md)
97     return -1;
98     gpg_md_write (md, (char *)key, len);
99     gpg_md_final (md);
100     memcpy (ka->Key[ka->KeyNum++], gpg_md_read (md), ka->KeyLength);
101     gpg_md_close (md);
102     return 0;
103     }
104     #endif
105    
106    
107     int
108     filedisk_mount (int DeviceNumber,
109     OPEN_FILE_INFORMATION *ofi,
110     char drivelet,
111     BOOLEAN CdImage)
112     {
113     char VolumeName[] = "\\\\.\\ :";
114     char DeviceName[255];
115     HANDLE Device;
116     DWORD BytesReturned;
117    
118     VolumeName[4] = drivelet;
119    
120     Device = CreateFile (VolumeName,
121     GENERIC_READ | GENERIC_WRITE,
122     FILE_SHARE_READ | FILE_SHARE_WRITE,
123     NULL,
124     OPEN_EXISTING,
125     FILE_FLAG_NO_BUFFERING,
126     NULL);
127     if (Device != INVALID_HANDLE_VALUE) {
128     SetLastError (ERROR_BUSY);
129     print_lasterr (&VolumeName[4]);
130     return CDISK_ERR_BUSY;
131     }
132    
133     if (CdImage)
134     sprintf (DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber);
135     else
136     sprintf (DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber);
137    
138     if (!DefineDosDevice (DDD_RAW_TARGET_PATH,
139     &VolumeName[4],
140     DeviceName)) {
141     print_lasterr (&VolumeName[4]);
142     return CDISK_ERR_OPEN;
143     }
144    
145     Device = CreateFile (VolumeName,
146     GENERIC_READ | GENERIC_WRITE,
147     FILE_SHARE_READ | FILE_SHARE_WRITE,
148     NULL,
149     OPEN_EXISTING,
150     FILE_FLAG_NO_BUFFERING,
151     NULL);
152    
153     if (Device == INVALID_HANDLE_VALUE) {
154     print_lasterr (&VolumeName[4]);
155     DefineDosDevice (DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
156     return CDISK_ERR_OPEN;
157     }
158    
159     if (!DeviceIoControl (Device,
160     IOCTL_FILE_DISK_OPEN_FILE,
161     ofi,
162     sizeof(OPEN_FILE_INFORMATION) + ofi->FileNameLength - 1,
163     NULL, 0, &BytesReturned, NULL)) {
164     print_lasterr ("Cryptdisk Error");
165     DefineDosDevice (DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
166     return CDISK_ERR_MOUNT;
167     }
168    
169     return 0;
170     }
171    
172    
173     static int
174     filedisk_unmount2 (char drivelet, int flags, int forced)
175     {
176     char VolumeName[60] = "\\\\.\\ :";
177     HANDLE Device;
178     DWORD BytesReturned;
179    
180     if (!flags)
181     VolumeName[4] = drivelet;
182     else if (flags & 1)
183     sprintf(VolumeName,"\\\\.\\FileDisk%d", drivelet);
184     else if (flags & 2)
185     sprintf(VolumeName,"\\\\.\\FileDiskCd%d",drivelet);
186    
187     Device = CreateFile (VolumeName,
188     GENERIC_READ | GENERIC_WRITE,
189     FILE_SHARE_READ | FILE_SHARE_WRITE,
190     NULL,
191     OPEN_EXISTING,
192     FILE_FLAG_NO_BUFFERING,
193     NULL);
194     if (Device == INVALID_HANDLE_VALUE) {
195     if (forced)
196     print_lasterr(&VolumeName[4]);
197     return CDISK_ERR_OPEN;
198     }
199    
200     if (!DeviceIoControl (Device,
201     FSCTL_LOCK_VOLUME,
202     NULL, 0, NULL, 0,
203     &BytesReturned, NULL)) {
204     if (forced) {
205     print_lasterr(&VolumeName[4]);
206     return CDISK_ERR_LOCK;
207     }
208     }
209    
210     if (!DeviceIoControl (Device,
211     IOCTL_FILE_DISK_CLOSE_FILE,
212     NULL, 0, NULL, 0,
213     &BytesReturned, NULL )) {
214     if (forced)
215     print_lasterr ("Cryptdisk Error");
216     return CDISK_ERR_UMOUNT;
217     }
218    
219     if (!DeviceIoControl (
220     Device, FSCTL_DISMOUNT_VOLUME,
221     NULL, 0, NULL, 0,
222     &BytesReturned, NULL)) {
223     if (forced)
224     print_lasterr (&VolumeName[4]);
225     return CDISK_ERR_UMOUNT;
226     }
227    
228     if (!DeviceIoControl (Device,
229     FSCTL_UNLOCK_VOLUME,
230     NULL, 0, NULL, 0,
231     &BytesReturned, NULL)) {
232     if (forced) {
233     print_lasterr (&VolumeName[4]);
234     return CDISK_ERR_LOCK;
235     }
236     }
237    
238     CloseHandle (Device);
239    
240     if (!DefineDosDevice (
241     DDD_REMOVE_DEFINITION,
242     &VolumeName[4], NULL)) {
243     if (forced)
244     print_lasterr (&VolumeName[4]);
245     return CDISK_ERR_UMOUNT;
246     }
247    
248     return 0;
249     }
250    
251     int
252     filedisk_unmount (char drivelet, int forced)
253     {
254     char i;
255    
256     if (drivelet) {
257     int rc = filedisk_unmount2 (drivelet, 0, forced);
258     if (rc)
259     print_lasterr ("Unmount´");
260     return rc;
261     }
262     for (i=0; i<20;i++) {
263     if (filedisk_unmount2 (i, 1, 0) == CDISK_ERR_OPEN)
264     break;
265     }
266     for (i=0; i<20;i++) {
267     if (filedisk_unmount2 (i, 2, 0) == CDISK_ERR_OPEN)
268     break;
269     }
270     return 0;
271     }
272    
273    
274     int
275     filedisk_status (char drivelet, LARGE_INTEGER * size, int * rdonly)
276     {
277     char VolumeName[] = "\\\\.\\ :";
278     HANDLE Device;
279     POPEN_FILE_INFORMATION ofi;
280     DWORD BytesReturned;
281    
282     VolumeName[4] = drivelet;
283    
284     Device = CreateFile (VolumeName,
285     GENERIC_READ,
286     FILE_SHARE_READ | FILE_SHARE_WRITE,
287     NULL,
288     OPEN_EXISTING,
289     FILE_FLAG_NO_BUFFERING,
290     NULL);
291    
292     if (Device == INVALID_HANDLE_VALUE) {
293     print_lasterr(&VolumeName[4]);
294     return CDISK_ERR_OPEN;
295     }
296    
297     ofi = malloc (sizeof(OPEN_FILE_INFORMATION) + MAX_PATH);
298    
299     if (!DeviceIoControl (Device,
300     IOCTL_FILE_DISK_QUERY_FILE,
301     NULL,
302     0,
303     ofi,
304     sizeof(OPEN_FILE_INFORMATION) + MAX_PATH,
305     &BytesReturned, NULL)) {
306     print_lasterr (&VolumeName[4]);
307     return CDISK_ERR_QUERY;
308     }
309    
310     if (BytesReturned < sizeof(OPEN_FILE_INFORMATION)) {
311     SetLastError (ERROR_INSUFFICIENT_BUFFER);
312     print_lasterr (&VolumeName[4]);
313     return CDISK_ERR_QUERY;
314     }
315    
316     if (size)
317     *size = ofi->FileSize;
318     if (rdonly)
319     *rdonly = ofi->ReadOnly;
320    
321     return 0;
322     }
323    
324    
325     POPEN_FILE_INFORMATION
326     filedisk_init_info (int devnum, char drivelet, const char * file,
327     int ro, int cd_img, unsigned long size, const char * key,
328     int keyalgo)
329     {
330     POPEN_FILE_INFORMATION pfi;
331    
332     pfi = calloc (1, sizeof(OPEN_FILE_INFORMATION) + strlen (file) + 7);
333     if (!pfi)
334     return NULL;
335    
336     /*pfi->version = CCVERSION;*/
337     if (file[0] == '\\') {
338     if (file[1] == '\\' && file[2] != '.') {
339     /* \\server\share\path\filedisk.img */
340     strcpy(pfi->FileName, "\\??\\UNC");
341     strcat(pfi->FileName, file + 1);
342     }
343     else /* \Device\Harddisk0\Partition1\path\filedisk.img */
344     strcpy(pfi->FileName, file);
345     }
346     else { // c:\path\filedisk.img
347     strcpy (pfi->FileName, "\\??\\");
348     strcat (pfi->FileName, file);
349     }
350    
351     pfi->FileNameLength = (USHORT) strlen (pfi->FileName);
352     pfi->ReadOnly = ro? TRUE : FALSE;
353     if (cd_img)
354     pfi->ReadOnly = TRUE;
355     if (size)
356     pfi->FileSize.QuadPart = size * 1024;
357     if (key) {
358     /*
359     if (keyalgo < 1 || keyalgo > 4)
360     pfi->KeyType = 1;
361     else
362     pfi->KeyType = keyalgo;
363     add_key (pfi, key, strlen (key));
364     */
365     }
366    
367     return pfi;
368     }
369    
370    
371     void
372     filedisk_free_info (POPEN_FILE_INFORMATION pfi)
373     {
374     if (!pfi)
375     return;
376     /*memset (pfi->Key, 0, sizeof pfi->Key);*/
377     free (pfi);
378     }
379     #endif
380    

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26