实现功能:
将用户指定的某个文件A 虚拟成一个分区B, 用户在分区上B操作的数据会保存到文件A上
需要解决的问题:
1、如何虚拟出一个新的设备(分区)?
2、如何将访问这个分区的操作转化为读取某个文件的操作?
2008.09.02
2008.09.03
输出结果如下:
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
接着,蓝屏……
表示很怀疑,把 tmp 的值也打印出来
KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));
wcsncat (ntname, tmp, 1);
----------------------------------------------------------------------------------------
结果显示
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
---
根据代码的执行结果:
tmp 的值应该是 D: 才对!!!!! 奇怪!!!
问题,
1、KdPrint 在打印 WCHAR[] 与 UNICODE_STRING 时的处理
2、WCHAR[] 与 UNICODE_STRING 的连接又该如何?(如果没有成功编译 TrueCrypt,所以无法跟踪到它里面的值的变化)
--------------------------------------------------------
于是先把创建设备的代码去掉,先把 ntUnicodeString 正确显示出来
2008.09.04
问题1:
运行 TrueCrypt\Driver\BuildDriver.cmd ,不能编译驱动,提示 "BuildDriver.cmd: error: Cannot copy target."
没有时间看 ReadMe. 未解决
问题2:
将 TrueCrypt.sln 用工具转换为 TrueCrypt.dsw ,打开后无论编译哪一个工程,都会提示很多错误信息
未解决
问题3:
IoCreateDevice 最后一个参数 Returned ptr to Device Object, 是否需要为其分配空间
-- Answered by bill Bill Gates : Device Object对象由系统分配,系统会在这个对象reference count为0的时候自动销毁。
安装 filedisk 后
产生问题1: 看了下设备管理器并没有多出一个设备,那么E盘怎么出来的?
用 WinObj.exe 也无所发现 (先迷茫一下先!!!)
产生问题1:
filedisk 的 exe 为何不能用 nmake 来编译?
产生问题2:
ddk 也可以用来编译 exe 程序?
产生问题3:
如果用 vc 建一个 Win32 Console Application 工程又能否编译?
-- 试了一下,果然是可以滴!!
产生很奇怪的问题1:
用自己编译的 exe && sys 运后,可以正常虚拟一个分区出来,但 win 提示不能格式化分区
-- 用原先的 exe 再试一下, 试过后, win 仍然提示不能格式化分区
于是用回 原先的 sys 再试一下,
突然间怀疑,是不是 映象文件的问题,因为我用的是
filedisk /mount 0 c:\test.txt 8M e:
后缀名是 .txt
改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分区成功,于是
产生很奇怪的问题2:
filedisk 的映象文件的后缀名如果为 .txt ,会导致 win 不能格式化虚拟出来的分区?
按道理应该跟映象文件的后缀名无关才是,估计要研究下里面的代码才清楚了!!!
-- 未解决
另外还产生很奇怪的问题3:
我把映象文件的大小设置 1K, win会提示“无法完成格式化”,难道 win 需要空间存放文件分配表?
试了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具体值无尝试
另一方面,如果 windows 的分区在格式化时,它应该会建一个{文件分配表}之类的东西,
而这个{文件分配表}的大小应该跟分区的大小有关 (暂无找到相关的资料,未解决)
-- 未解决
将用户指定的某个文件A 虚拟成一个分区B, 用户在分区上B操作的数据会保存到文件A上
需要解决的问题:
1、如何虚拟出一个新的设备(分区)?
2、如何将访问这个分区的操作转化为读取某个文件的操作?
2008.09.02
大概看了 TrueCrypt 源代码
1.
DriverEntry() 中
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
DriverObject->MajorFunction[i] = TCDispatchQueueIRP;
}
2、TCDispatchQueueIRP 处理 IRP 代码
case IRP_MJ_FLUSH_BUFFERS:
case IRP_MJ_READ:
case IRP_MJ_WRITE:
case IRP_MJ_DEVICE_CONTROL:
if (Extension->bRootDevice)
{
if (irpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
return ProcessMainDeviceControlIrp (DeviceObject, Extension, Irp);
break;
}
在处理IRP时,还需要注意区分是系统真实分区发出的IRP,还是由虚拟出来的分区发出的IRP
3、ProcessMainDeviceControlIrp() 中
case TC_IOCTL_MOUNT_VOLUME:
Irp->IoStatus.Information = sizeof (MOUNT_STRUCT);
Irp->IoStatus.Status = MountDevice (DeviceObject, mount);
DriverMutexRelease ();
判断由应用程序发出的 CTL_CODE
4、MountDevice() 中
ntStatus = TCCreateDeviceObject (DeviceObject->DriverObject, &NewDeviceObject,
mount);
if (!NT_SUCCESS (ntStatus))
{
Dump ("Mount CREATE DEVICE ERROR, ntStatus = 0x%08x\n", ntStatus);
return ntStatus;
}
5、TCCreateDeviceObject() 中
NTSTATUS
TCCreateDeviceObject (PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT * ppDeviceObject,
MOUNT_STRUCT * mount)
{
UNICODE_STRING Win32NameString, ntUnicodeString;
WCHAR dosname[32], ntname[32];
PEXTENSION Extension;
NTSTATUS ntStatus;
ULONG devChars = 0;
Dump ("TCCreateDeviceObject BEGIN\n");
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
TCGetDosNameFromNumber (dosname, mount->nDosDriveNo);
TCGetNTNameFromNumber (ntname, mount->nDosDriveNo);
RtlInitUnicodeString (&ntUnicodeString, ntname);
RtlInitUnicodeString (&Win32NameString, dosname);
devChars = FILE_DEVICE_SECURE_OPEN;
devChars |= mount->bMountReadOnly ? FILE_READ_ONLY_DEVICE : 0;
devChars |= mount->bMountRemovable ? FILE_REMOVABLE_MEDIA : 0;
Dump ("Creating device nt=%ls dos=%ls\n", ntname, dosname);
ntStatus = IoCreateDevice (
DriverObject, /* Our Driver Object */
sizeof (EXTENSION), /* Size of state information */
&ntUnicodeString, /* Device name "\Device\Name" */
FILE_DEVICE_DISK, /* Device type */
devChars, /* Device characteristics */
FALSE, /* Exclusive device */
ppDeviceObject); /* Returned ptr to Device Object */
if (!NT_SUCCESS (ntStatus))
{
Dump ("TCCreateDeviceObject NTSTATUS = 0x%08x END\n", ntStatus);
return ntStatus;/* Failed to create DeviceObject */
}
/* Initialize device object and extension. */
(*ppDeviceObject)->Flags |= DO_DIRECT_IO;
(*ppDeviceObject)->StackSize += 2; // Reduce occurrence of NO_MORE_IRP_STACK_LOCATIONS bug check caused by buggy drivers
/* Setup the device extension */
Extension = (PEXTENSION) (*ppDeviceObject)->DeviceExtension;
memset (Extension, 0, sizeof (EXTENSION));
Extension->IsVolumeDevice = TRUE;
Extension->lMagicNumber = 0xabfeacde;
Extension->nDosDriveNo = mount->nDosDriveNo;
Extension->bRemovable = mount->bMountRemovable;
KeInitializeEvent (&Extension->keCreateEvent, SynchronizationEvent, FALSE);
KeInitializeSemaphore (&Extension->RequestSemaphore, 0L, MAXLONG);
KeInitializeSpinLock (&Extension->ListSpinLock);
InitializeListHead (&Extension->ListEntry);
Dump ("TCCreateDeviceObject STATUS_SUCCESS END\n");
return STATUS_SUCCESS;
}
虚拟出一个分区的关键应该在 (5) 中,等明天再试。
1.
DriverEntry() 中
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
DriverObject->MajorFunction[i] = TCDispatchQueueIRP;
}
2、TCDispatchQueueIRP 处理 IRP 代码
case IRP_MJ_FLUSH_BUFFERS:
case IRP_MJ_READ:
case IRP_MJ_WRITE:
case IRP_MJ_DEVICE_CONTROL:
if (Extension->bRootDevice)
{
if (irpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
return ProcessMainDeviceControlIrp (DeviceObject, Extension, Irp);
break;
}
在处理IRP时,还需要注意区分是系统真实分区发出的IRP,还是由虚拟出来的分区发出的IRP
3、ProcessMainDeviceControlIrp() 中
case TC_IOCTL_MOUNT_VOLUME:
Irp->IoStatus.Information = sizeof (MOUNT_STRUCT);
Irp->IoStatus.Status = MountDevice (DeviceObject, mount);
DriverMutexRelease ();
判断由应用程序发出的 CTL_CODE
4、MountDevice() 中
ntStatus = TCCreateDeviceObject (DeviceObject->DriverObject, &NewDeviceObject,
mount);
if (!NT_SUCCESS (ntStatus))
{
Dump ("Mount CREATE DEVICE ERROR, ntStatus = 0x%08x\n", ntStatus);
return ntStatus;
}
5、TCCreateDeviceObject() 中
NTSTATUS
TCCreateDeviceObject (PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT * ppDeviceObject,
MOUNT_STRUCT * mount)
{
UNICODE_STRING Win32NameString, ntUnicodeString;
WCHAR dosname[32], ntname[32];
PEXTENSION Extension;
NTSTATUS ntStatus;
ULONG devChars = 0;
Dump ("TCCreateDeviceObject BEGIN\n");
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
TCGetDosNameFromNumber (dosname, mount->nDosDriveNo);
TCGetNTNameFromNumber (ntname, mount->nDosDriveNo);
RtlInitUnicodeString (&ntUnicodeString, ntname);
RtlInitUnicodeString (&Win32NameString, dosname);
devChars = FILE_DEVICE_SECURE_OPEN;
devChars |= mount->bMountReadOnly ? FILE_READ_ONLY_DEVICE : 0;
devChars |= mount->bMountRemovable ? FILE_REMOVABLE_MEDIA : 0;
Dump ("Creating device nt=%ls dos=%ls\n", ntname, dosname);
ntStatus = IoCreateDevice (
DriverObject, /* Our Driver Object */
sizeof (EXTENSION), /* Size of state information */
&ntUnicodeString, /* Device name "\Device\Name" */
FILE_DEVICE_DISK, /* Device type */
devChars, /* Device characteristics */
FALSE, /* Exclusive device */
ppDeviceObject); /* Returned ptr to Device Object */
if (!NT_SUCCESS (ntStatus))
{
Dump ("TCCreateDeviceObject NTSTATUS = 0x%08x END\n", ntStatus);
return ntStatus;/* Failed to create DeviceObject */
}
/* Initialize device object and extension. */
(*ppDeviceObject)->Flags |= DO_DIRECT_IO;
(*ppDeviceObject)->StackSize += 2; // Reduce occurrence of NO_MORE_IRP_STACK_LOCATIONS bug check caused by buggy drivers
/* Setup the device extension */
Extension = (PEXTENSION) (*ppDeviceObject)->DeviceExtension;
memset (Extension, 0, sizeof (EXTENSION));
Extension->IsVolumeDevice = TRUE;
Extension->lMagicNumber = 0xabfeacde;
Extension->nDosDriveNo = mount->nDosDriveNo;
Extension->bRemovable = mount->bMountRemovable;
KeInitializeEvent (&Extension->keCreateEvent, SynchronizationEvent, FALSE);
KeInitializeSemaphore (&Extension->RequestSemaphore, 0L, MAXLONG);
KeInitializeSpinLock (&Extension->ListSpinLock);
InitializeListHead (&Extension->ListEntry);
Dump ("TCCreateDeviceObject STATUS_SUCCESS END\n");
return STATUS_SUCCESS;
}
虚拟出一个分区的关键应该在 (5) 中,等明天再试。
2008.09.03
在昨天的基础上, 尝试将创建虚拟设备的部份代码抽出来
代码如下:
代码如下:
1
#ifdef __cplusplus
2 extern "C"
3 {
4 #endif
5 #include <ntddk.h>
6 #ifdef __cplusplus
7 }
8 #endif
9 #ifdef NT4_DRIVER
10 #define DRIVER_STR WIDE
11 #else
12 #define DRIVER_STR
13 #endif
14 #define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
15 PDEVICE_OBJECT gSFilterDriverObject = NULL;
16 /**//* This structure is allocated for non-root devices! WARNING: bRootDevice
17 must be the first member of the structure! */
18 typedef struct EXTENSION
19 {
20 } EXTENSION, *PEXTENSION;
21 typedef struct _DEVICE_EXTENSION
22 {
23 PDEVICE_OBJECT fdo;
24 PDEVICE_OBJECT NextStackDevice;
25 UNICODE_STRING ifSymLinkName;
26 }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
27 extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
28 IN PDEVICE_OBJECT PhysicalDeviceObject)
29 {
30
31 NTSTATUS status;
32 PDEVICE_OBJECT fdo;
33
34 status = IoCreateDevice(
35 DriverObject,
36 sizeof(DEVICE_EXTENSION),
37 NULL,
38 FILE_DEVICE_DISK,
39 0,
40 FALSE,
41 &fdo);
42
43 if( !NT_SUCCESS(status))
44 return status;
45
46 PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
47 dx->fdo = fdo;
48
49 dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
50 fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
51 fdo->Flags &= ~DO_DEVICE_INITIALIZING;
52
53 return STATUS_SUCCESS;
54 }
55 extern "C" void
56 TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
57 {
58 WCHAR tmp[3] =
59 {0, ':', 0};
60 int j = nDriveNo + (WCHAR) 'A';
61 tmp[0] = (short) j;
62 wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
63 wcsncat (ntname, tmp, 1);
64 }
65 extern "C" NTSTATUS
66 DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
67 {
68 NTSTATUS ntStatus;
69 WCHAR dosname[32], ntname[32];
70 ULONG devChars = 0;
71 // 定义一个 Unicode 字符串
72 UNICODE_STRING ntUnicodeString;
73 //RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
74 DriverObject->DriverExtension->AddDevice = AddDevice;
75 KdPrint(("SFilter!DriverEntry\n"));
76
77 TCGetNTNameFromNumber (ntname, 3);
78 RtlInitUnicodeString (&ntUnicodeString, ntname);
79 KdPrint(("SFilter!DriverEntry: Create Driver \"%wZ\"\n", &ntUnicodeString));
80 devChars = FILE_DEVICE_SECURE_OPEN;
81
82 PDEVICE_OBJECT pDeviceObject = NULL;
83
84 // 创建虚拟设备
85 ntStatus = IoCreateDevice (
86 DriverObject, /**//* Our Driver Object */
87 sizeof (EXTENSION), /**//* Size of state information */
88 &ntUnicodeString, /**//* Device name "\Device\Name" */
89 FILE_DEVICE_DISK, /**//* Device type */
90 devChars, /**//* Device characteristics */
91 FALSE, /**//* Exclusive device */
92 &pDeviceObject); /**//* Returned ptr to Device Object */
93
94 if ( !NT_SUCCESS( ntStatus ) )
95 {
96 KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
97 }
98 else
99 {
100 KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
101 }
102
103 return ntStatus;
104 }
105
2 extern "C"
3 {
4 #endif
5 #include <ntddk.h>
6 #ifdef __cplusplus
7 }
8 #endif
9 #ifdef NT4_DRIVER
10 #define DRIVER_STR WIDE
11 #else
12 #define DRIVER_STR
13 #endif
14 #define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
15 PDEVICE_OBJECT gSFilterDriverObject = NULL;
16 /**//* This structure is allocated for non-root devices! WARNING: bRootDevice
17 must be the first member of the structure! */
18 typedef struct EXTENSION
19 {
20 } EXTENSION, *PEXTENSION;
21 typedef struct _DEVICE_EXTENSION
22 {
23 PDEVICE_OBJECT fdo;
24 PDEVICE_OBJECT NextStackDevice;
25 UNICODE_STRING ifSymLinkName;
26 }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
27 extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
28 IN PDEVICE_OBJECT PhysicalDeviceObject)
29 {
30
31 NTSTATUS status;
32 PDEVICE_OBJECT fdo;
33
34 status = IoCreateDevice(
35 DriverObject,
36 sizeof(DEVICE_EXTENSION),
37 NULL,
38 FILE_DEVICE_DISK,
39 0,
40 FALSE,
41 &fdo);
42
43 if( !NT_SUCCESS(status))
44 return status;
45
46 PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
47 dx->fdo = fdo;
48
49 dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
50 fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
51 fdo->Flags &= ~DO_DEVICE_INITIALIZING;
52
53 return STATUS_SUCCESS;
54 }
55 extern "C" void
56 TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
57 {
58 WCHAR tmp[3] =
59 {0, ':', 0};
60 int j = nDriveNo + (WCHAR) 'A';
61 tmp[0] = (short) j;
62 wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
63 wcsncat (ntname, tmp, 1);
64 }
65 extern "C" NTSTATUS
66 DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
67 {
68 NTSTATUS ntStatus;
69 WCHAR dosname[32], ntname[32];
70 ULONG devChars = 0;
71 // 定义一个 Unicode 字符串
72 UNICODE_STRING ntUnicodeString;
73 //RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
74 DriverObject->DriverExtension->AddDevice = AddDevice;
75 KdPrint(("SFilter!DriverEntry\n"));
76
77 TCGetNTNameFromNumber (ntname, 3);
78 RtlInitUnicodeString (&ntUnicodeString, ntname);
79 KdPrint(("SFilter!DriverEntry: Create Driver \"%wZ\"\n", &ntUnicodeString));
80 devChars = FILE_DEVICE_SECURE_OPEN;
81
82 PDEVICE_OBJECT pDeviceObject = NULL;
83
84 // 创建虚拟设备
85 ntStatus = IoCreateDevice (
86 DriverObject, /**//* Our Driver Object */
87 sizeof (EXTENSION), /**//* Size of state information */
88 &ntUnicodeString, /**//* Device name "\Device\Name" */
89 FILE_DEVICE_DISK, /**//* Device type */
90 devChars, /**//* Device characteristics */
91 FALSE, /**//* Exclusive device */
92 &pDeviceObject); /**//* Returned ptr to Device Object */
93
94 if ( !NT_SUCCESS( ntStatus ) )
95 {
96 KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
97 }
98 else
99 {
100 KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
101 }
102
103 return ntStatus;
104 }
105
使用 windgb 调试得到
SFilter!DriverEntry
SFilter!DriverEntry: Create Driver "?"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
问题:
设备创建失败, 可能是由 ntUnicodeString 非法,
但为何 ntUnicodeString 会变成 ?
经试验, 将 KdPrint 的 \"%wZ\", 改为 %s
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
--------------------------------------------------
输出结果
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "$"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
经过 RtlInitUnicodeString (&ntUnicodeString, ntname); 后
ntUnicodeString 变成了 "?" ?
于是查 MSDN RtlInitUnicodeString 相关的信息, 用法似乎没有错
修改了一下程序
SFilter!DriverEntry
SFilter!DriverEntry: Create Driver "?"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
问题:
设备创建失败, 可能是由 ntUnicodeString 非法,
但为何 ntUnicodeString 会变成 ?
经试验, 将 KdPrint 的 \"%wZ\", 改为 %s
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
--------------------------------------------------
输出结果
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "$"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
经过 RtlInitUnicodeString (&ntUnicodeString, ntname); 后
ntUnicodeString 变成了 "?" ?
于是查 MSDN RtlInitUnicodeString 相关的信息, 用法似乎没有错
修改了一下程序
extern "C" void
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
WCHAR tmp[3] = {0, ':', 0};
int j = nDriveNo + (WCHAR) 'A';
tmp[0] = (short) j;
wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo));
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
wcsncat (ntname, tmp, 1);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}
extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus;
WCHAR dosname[32], ntname[32];
ULONG devChars = 0;
// 定义一个 Unicode 字符串
UNICODE_STRING ntUnicodeString;
//RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
DriverObject->DriverExtension->AddDevice = AddDevice;
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
WCHAR tmp[3] = {0, ':', 0};
int j = nDriveNo + (WCHAR) 'A';
tmp[0] = (short) j;
wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo));
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
wcsncat (ntname, tmp, 1);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}
extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus;
WCHAR dosname[32], ntname[32];
ULONG devChars = 0;
// 定义一个 Unicode 字符串
UNICODE_STRING ntUnicodeString;
//RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
DriverObject->DriverExtension->AddDevice = AddDevice;
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
输出结果如下:
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
接着,蓝屏……
表示很怀疑,把 tmp 的值也打印出来
KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));
wcsncat (ntname, tmp, 1);
----------------------------------------------------------------------------------------
结果显示
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
---
根据代码的执行结果:
tmp 的值应该是 D: 才对!!!!! 奇怪!!!
问题,
1、KdPrint 在打印 WCHAR[] 与 UNICODE_STRING 时的处理
2、WCHAR[] 与 UNICODE_STRING 的连接又该如何?(如果没有成功编译 TrueCrypt,所以无法跟踪到它里面的值的变化)
--------------------------------------------------------
于是先把创建设备的代码去掉,先把 ntUnicodeString 正确显示出来
#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif
#ifdef NT4_DRIVER
#define DRIVER_STR WIDE
#else
#define DRIVER_STR
#endif
#define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
PDEVICE_OBJECT gSFilterDriverObject = NULL;
/**//* This structure is allocated for non-root devices! WARNING: bRootDevice
must be the first member of the structure! */
typedef struct EXTENSION
{
} EXTENSION, *PEXTENSION;
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRING ifSymLinkName;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
NTSTATUS status;
PDEVICE_OBJECT fdo;
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_DISK,
0,
FALSE,
&fdo);
if( !NT_SUCCESS(status))
return status;
PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
dx->fdo = fdo;
dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
extern "C" void
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
WCHAR tmp[3] = {0, ':', 0};
int j = nDriveNo + (WCHAR) 'A';
tmp[0] = (short) j;
wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo));
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));
wcsncat (ntname, tmp, 1);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}
extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
WCHAR dosname[32], ntname[32];
ULONG devChars = 0;
// 定义一个 Unicode 字符串
UNICODE_STRING ntUnicodeString;
//RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
DriverObject->DriverExtension->AddDevice = AddDevice;
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
/**//*
devChars = FILE_DEVICE_SECURE_OPEN;
PDEVICE_OBJECT pDeviceObject = NULL;
// 创建虚拟设备
ntStatus = IoCreateDevice (
DriverObject, /* Our Driver Object * /
sizeof (EXTENSION), /* Size of state information * /
&ntUnicodeString, /* Device name "\Device\Name" * /
FILE_DEVICE_DISK, /* Device type * /
devChars, /* Device characteristics * /
FALSE, /* Exclusive device * /
&pDeviceObject); /* Returned ptr to Device Object * /
if ( !NT_SUCCESS( ntStatus ) )
{
KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
}
else
{
KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
}*/
return ntStatus;
}
---
代码改成了这样后, 调试依然会蓝屏。
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
*** Fatal System Error: 0x0000007e
(0xC0000005,0x46656D61,0xF9EA2770,0xF9EA246C)
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
需要回滚代码。明天再继续。
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif
#ifdef NT4_DRIVER
#define DRIVER_STR WIDE
#else
#define DRIVER_STR
#endif
#define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
PDEVICE_OBJECT gSFilterDriverObject = NULL;
/**//* This structure is allocated for non-root devices! WARNING: bRootDevice
must be the first member of the structure! */
typedef struct EXTENSION
{
} EXTENSION, *PEXTENSION;
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRING ifSymLinkName;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
NTSTATUS status;
PDEVICE_OBJECT fdo;
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_DISK,
0,
FALSE,
&fdo);
if( !NT_SUCCESS(status))
return status;
PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
dx->fdo = fdo;
dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
extern "C" void
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
WCHAR tmp[3] = {0, ':', 0};
int j = nDriveNo + (WCHAR) 'A';
tmp[0] = (short) j;
wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo));
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));
wcsncat (ntname, tmp, 1);
KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}
extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
WCHAR dosname[32], ntname[32];
ULONG devChars = 0;
// 定义一个 Unicode 字符串
UNICODE_STRING ntUnicodeString;
//RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
DriverObject->DriverExtension->AddDevice = AddDevice;
KdPrint(("SFilter!DriverEntry\n"));
TCGetNTNameFromNumber (ntname, 3);
KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
/**//*
devChars = FILE_DEVICE_SECURE_OPEN;
PDEVICE_OBJECT pDeviceObject = NULL;
// 创建虚拟设备
ntStatus = IoCreateDevice (
DriverObject, /* Our Driver Object * /
sizeof (EXTENSION), /* Size of state information * /
&ntUnicodeString, /* Device name "\Device\Name" * /
FILE_DEVICE_DISK, /* Device type * /
devChars, /* Device characteristics * /
FALSE, /* Exclusive device * /
&pDeviceObject); /* Returned ptr to Device Object * /
if ( !NT_SUCCESS( ntStatus ) )
{
KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
}
else
{
KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
}*/
return ntStatus;
}
---
代码改成了这样后, 调试依然会蓝屏。
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
*** Fatal System Error: 0x0000007e
(0xC0000005,0x46656D61,0xF9EA2770,0xF9EA246C)
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
需要回滚代码。明天再继续。
2008.09.04
今天打算先看下应用层与驱动通信的方法
然后再看下由 Bill Gates 说的(做file disk建议看filedisk的源代码,在 http://www.acc.umu.se/~bosse。)
在开始工作之前,先感谢一下 BillGates ,虽然他已经退休了,但居然光临我的BLOG,
然后再看下由 Bill Gates 说的(做file disk建议看filedisk的源代码,在 http://www.acc.umu.se/~bosse。)
在开始工作之前,先感谢一下 BillGates ,虽然他已经退休了,但居然光临我的BLOG,
读 filedisk 的代码前,想先使用一下它
看了 Readme,安装 filedisk 的步骤(它居然连 .inf 都省了,直接用.reg 晕!!!! )
1、把 filedisk.sys 拷贝到 %systemroot%\system32\drivers\
2、filedisk.reg 里面设置的驱动加载方面默认是 {自动}的,所以不用改了
产生问题1:
有了这个 .reg 就相当于 .inf? .reg 安装驱动跟 .inf 安装驱动方法的区别?
-- 未解决
3、运行 filedisk.reg 然后重启
4、重启后, 在cmd 窗体执行命令
filedisk /mount 0 c:\test.img 8M e:
5、此时,系统多出一个 e 盘,双击提示未格式化,格式化完 E 盘后,就可以像普通磁盘一样操作了
产生问题1: 看了下设备管理器并没有多出一个设备,那么E盘怎么出来的?
用 WinObj.exe 也无所发现 (先迷茫一下先!!!)
接下来,试下编译 filedisk sys 的源程序
build filedisk 没出现问题,生成了 check 的 filedisk.sys
然后,试下编译 filedisk exe 的程序
在 exe 目录下 nmake /f makefile ,却出现错误提示
Microsoft (R) Program Maintenance Utility Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
makefile(7) : fatal error U1052: file '\makefile.def' not found
Stop.
google了一下,找到方法
据说 exe 同样用DDK的环境来编译
在 filedisk 的 exe 目录 build -cz
果然,编译通过了生成了 filedisk.exe
产生问题1:
filedisk 的 exe 为何不能用 nmake 来编译?
产生问题2:
ddk 也可以用来编译 exe 程序?
产生问题3:
如果用 vc 建一个 Win32 Console Application 工程又能否编译?
-- 试了一下,果然是可以滴!!
把自己编译的 filedisk.sys 和 filedisk.exe 放到虚拟机试下是否正常先.
因为刚刚在前面已经设置了驱动是自动加载的,怕覆盖 filedisk.sys 后,系统还是会用回原来的 filedisk.sys
于是重启一下系统先~!
产生很奇怪的问题1:
用自己编译的 exe && sys 运后,可以正常虚拟一个分区出来,但 win 提示不能格式化分区
-- 用原先的 exe 再试一下, 试过后, win 仍然提示不能格式化分区
于是用回 原先的 sys 再试一下,
突然间怀疑,是不是 映象文件的问题,因为我用的是
filedisk /mount 0 c:\test.txt 8M e:
后缀名是 .txt
改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分区成功,于是
产生很奇怪的问题2:
filedisk 的映象文件的后缀名如果为 .txt ,会导致 win 不能格式化虚拟出来的分区?
按道理应该跟映象文件的后缀名无关才是,估计要研究下里面的代码才清楚了!!!
-- 未解决
另外还产生很奇怪的问题3:
我把映象文件的大小设置 1K, win会提示“无法完成格式化”,难道 win 需要空间存放文件分配表?
试了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具体值无尝试
另一方面,如果 windows 的分区在格式化时,它应该会建一个 {文件分配表}之类的东西,
而这个 {文件分配表}的大小应该跟分区的大小有关 (暂无找到相关的资料,未解决)
-- 未解决
大概看了下 filedisk.c 的代码, 里面用的是
CreateFile + DeviceIoControl 的方法 跟 驱动通信
里面并没有采用动态加载驱动
问题1:
如何动态加载驱动?
之前在网上看到的资料应该有“SM”之类的API可以动态加载驱动,
这个有时间再研究.
一个上午的时间就这样被花光了!!!!!
看了 Readme,安装 filedisk 的步骤(它居然连 .inf 都省了,直接用.reg 晕!!!! )
1、把 filedisk.sys 拷贝到 %systemroot%\system32\drivers\
2、filedisk.reg 里面设置的驱动加载方面默认是 {自动}的,所以不用改了
产生问题1:
有了这个 .reg 就相当于 .inf? .reg 安装驱动跟 .inf 安装驱动方法的区别?
-- 未解决
3、运行 filedisk.reg 然后重启
4、重启后, 在cmd 窗体执行命令
filedisk /mount 0 c:\test.img 8M e:
5、此时,系统多出一个 e 盘,双击提示未格式化,格式化完 E 盘后,就可以像普通磁盘一样操作了
产生问题1: 看了下设备管理器并没有多出一个设备,那么E盘怎么出来的?
用 WinObj.exe 也无所发现 (先迷茫一下先!!!)
接下来,试下编译 filedisk sys 的源程序
build filedisk 没出现问题,生成了 check 的 filedisk.sys
然后,试下编译 filedisk exe 的程序
在 exe 目录下 nmake /f makefile ,却出现错误提示
Microsoft (R) Program Maintenance Utility Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
makefile(7) : fatal error U1052: file '\makefile.def' not found
Stop.
google了一下,找到方法
据说 exe 同样用DDK的环境来编译
在 filedisk 的 exe 目录 build -cz
果然,编译通过了生成了 filedisk.exe
产生问题1:
filedisk 的 exe 为何不能用 nmake 来编译?
产生问题2:
ddk 也可以用来编译 exe 程序?
产生问题3:
如果用 vc 建一个 Win32 Console Application 工程又能否编译?
-- 试了一下,果然是可以滴!!
把自己编译的 filedisk.sys 和 filedisk.exe 放到虚拟机试下是否正常先.
因为刚刚在前面已经设置了驱动是自动加载的,怕覆盖 filedisk.sys 后,系统还是会用回原来的 filedisk.sys
于是重启一下系统先~!
产生很奇怪的问题1:
用自己编译的 exe && sys 运后,可以正常虚拟一个分区出来,但 win 提示不能格式化分区
-- 用原先的 exe 再试一下, 试过后, win 仍然提示不能格式化分区
于是用回 原先的 sys 再试一下,
突然间怀疑,是不是 映象文件的问题,因为我用的是
filedisk /mount 0 c:\test.txt 8M e:
后缀名是 .txt
改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分区成功,于是
产生很奇怪的问题2:
filedisk 的映象文件的后缀名如果为 .txt ,会导致 win 不能格式化虚拟出来的分区?
按道理应该跟映象文件的后缀名无关才是,估计要研究下里面的代码才清楚了!!!
-- 未解决
另外还产生很奇怪的问题3:
我把映象文件的大小设置 1K, win会提示“无法完成格式化”,难道 win 需要空间存放文件分配表?
试了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具体值无尝试
另一方面,如果 windows 的分区在格式化时,它应该会建一个 {文件分配表}之类的东西,
而这个 {文件分配表}的大小应该跟分区的大小有关 (暂无找到相关的资料,未解决)
-- 未解决
大概看了下 filedisk.c 的代码, 里面用的是
CreateFile + DeviceIoControl 的方法 跟 驱动通信
里面并没有采用动态加载驱动
问题1:
如何动态加载驱动?
之前在网上看到的资料应该有“SM”之类的API可以动态加载驱动,
这个有时间再研究.
一个上午的时间就这样被花光了!!!!!
问题1:
运行 TrueCrypt\Driver\BuildDriver.cmd ,不能编译驱动,提示 "BuildDriver.cmd: error: Cannot copy target."
没有时间看 ReadMe. 未解决
问题2:
将 TrueCrypt.sln 用工具转换为 TrueCrypt.dsw ,打开后无论编译哪一个工程,都会提示很多错误信息
未解决
问题3:
IoCreateDevice 最后一个参数 Returned ptr to Device Object, 是否需要为其分配空间
-- Answered by bill Bill Gates : Device Object对象由系统分配,系统会在这个对象reference count为0的时候自动销毁。
安装 filedisk 后
产生问题1: 看了下设备管理器并没有多出一个设备,那么E盘怎么出来的?
用 WinObj.exe 也无所发现 (先迷茫一下先!!!)
产生问题1:
filedisk 的 exe 为何不能用 nmake 来编译?
产生问题2:
ddk 也可以用来编译 exe 程序?
产生问题3:
如果用 vc 建一个 Win32 Console Application 工程又能否编译?
-- 试了一下,果然是可以滴!!
产生很奇怪的问题1:
用自己编译的 exe && sys 运后,可以正常虚拟一个分区出来,但 win 提示不能格式化分区
-- 用原先的 exe 再试一下, 试过后, win 仍然提示不能格式化分区
于是用回 原先的 sys 再试一下,
突然间怀疑,是不是 映象文件的问题,因为我用的是
filedisk /mount 0 c:\test.txt 8M e:
后缀名是 .txt
改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分区成功,于是
产生很奇怪的问题2:
filedisk 的映象文件的后缀名如果为 .txt ,会导致 win 不能格式化虚拟出来的分区?
按道理应该跟映象文件的后缀名无关才是,估计要研究下里面的代码才清楚了!!!
-- 未解决
另外还产生很奇怪的问题3:
我把映象文件的大小设置 1K, win会提示“无法完成格式化”,难道 win 需要空间存放文件分配表?
试了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具体值无尝试
另一方面,如果 windows 的分区在格式化时,它应该会建一个{文件分配表}之类的东西,
而这个{文件分配表}的大小应该跟分区的大小有关 (暂无找到相关的资料,未解决)
-- 未解决