Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows驱动程序,从内核创建/装载磁盘设备_C_Windows_Kernel_Driver_Wdk - Fatal编程技术网

C Windows驱动程序,从内核创建/装载磁盘设备

C Windows驱动程序,从内核创建/装载磁盘设备,c,windows,kernel,driver,wdk,C,Windows,Kernel,Driver,Wdk,我已经被一个问题困扰了三个星期了,我真的很想 继续进行填充文件系统代码的“真正的移植”工作。我是 尝试模拟从userland向 内核驱动程序。这是关于内核端代码的 我一直在阅读多坎的资料,并赢得btrfs 还有一些其他的,做类似的事情。也就是说,创造一个新的假货 磁盘设备,并以某种方式让它有一个“卷”来分配 一个驱动器号和文件系统请求蜂拥而至 我想相信(哈)我很接近。。。我简化了程序 尽可能多的来源,以帮助阅读,同样 清理日志,用变量名替换十六进制地址 我根据名称生成uuid,并将使用的名称放入

我已经被一个问题困扰了三个星期了,我真的很想 继续进行填充文件系统代码的“真正的移植”工作。我是 尝试模拟从userland向 内核驱动程序。这是关于内核端代码的

我一直在阅读多坎的资料,并赢得btrfs 还有一些其他的,做类似的事情。也就是说,创造一个新的假货 磁盘设备,并以某种方式让它有一个“卷”来分配 一个驱动器号和文件系统请求蜂拥而至

我想相信(哈)我很接近。。。我简化了程序 尽可能多的来源,以帮助阅读,同样 清理日志,用变量名替换十六进制地址

我根据名称生成uuid,并将使用的名称放入 在通话前发表评论

handle_mount_request_and_create_volume()
{
deviceCharacteristics = FILE_DEVICE_IS_MOUNTED;
deviceCharacteristics |= FILE_REMOVABLE_MEDIA;

// First create the disk device object,
// WIN_DriverObject is the DriverEntry object
status = IoCreateDeviceSecure(WIN_DriverObject,
    sizeof(myfs_mount_object_t),
    // '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
    &diskDeviceName,
    FILE_DEVICE_DISK,
    deviceCharacteristics,
    FALSE,
    &SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R,
    NULL,
    &diskDeviceObject);

myfs_mount_object_t *zmo_dcb = diskDeviceObject->DeviceExtension;
// '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
AsciiStringToUnicodeString(buf, &zmo_dcb->device_name);

// '\DosDevices\Global\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
AsciiStringToUnicodeString(buf, &zmo_dcb->symlink_name);

// '\Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
AsciiStringToUnicodeString(buf, &zmo_dcb->fs_name);

diskDeviceObject->Flags |= DO_DIRECT_IO;

// Now create the filesystem device object
status = IoCreateDeviceSecure(
    WIN_DriverObject,
    sizeof(myfs_mount_object_t),
    // '\Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
    &fsDeviceName,
    FILE_DEVICE_DISK_FILE_SYSTEM,
    deviceCharacteristics,
    FALSE,
    &SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R,
    NULL,
    &fsDeviceObject);

myfs_mount_object_t *zmo_vcb = fsDeviceObject->DeviceExtension;

dprintf("WinDeviceObject : %p\n", WIN_DriverObject);
dprintf("diskDeviceObject: %p\n", diskDeviceObject);
dprintf("fsDeviceObject  : %p\n", fsDeviceObject);

// '\Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
AsciiStringToUnicodeString(buf, &zmo_vcb->device_name);

// '\DosDevices\Global\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
AsciiStringToUnicodeString(buf, &zmo_vcb->symlink_name);

fsDeviceObject->Flags |= DO_DIRECT_IO;

diskDeviceObject->Vpb->DeviceObject = fsDeviceObject;
diskDeviceObject->Vpb->RealDevice = fsDeviceObject;
diskDeviceObject->Vpb->Flags |= VPB_MOUNTED;
diskDeviceObject->Vpb->VolumeLabelLength = wcslen(VOLUME_LABEL) * sizeof(WCHAR);
RtlStringCchCopyW(diskDeviceObject->Vpb->VolumeLabel,
    sizeof(diskDeviceObject->Vpb->VolumeLabel) / sizeof(WCHAR),
    VOLUME_LABEL);
diskDeviceObject->Vpb->SerialNumber = 0x19831116;

ObReferenceObject(fsDeviceObject);
ObReferenceObject(diskDeviceObject);

// Create symlink for userland
// '\DosDevices\Global\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
// '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
status = IoCreateSymbolicLink(&symbolicLinkTarget, &diskDeviceName);

// Mark devices as initialized
diskDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
fsDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

// Send IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION on the
// diskDeviceObject to MountMgr
// '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
SendVolumeArrivalNotification(&diskDeviceName);

// register objects
status = IoReportDetectedDevice(
    WIN_DriverObject,
    InterfaceTypeUndefined,
    0, 0, NULL, NULL, FALSE,
    &pnpDeviceObject);
IoAttachDeviceToDeviceStack(pnpDeviceObject, diskDeviceObject);
IoRegisterDeviceInterface(
    pnpDeviceObject,
    &GUID_DEVINTERFACE_DISK,
    NULL,
    // out "\??\ROOT#MYFS#0000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}"
    &diskDeviceName);
IoSetDeviceInterfaceState(&diskDeviceName, TRUE);
IoRegisterDeviceInterface(
    pnpDeviceObject,
    &MOUNTDEV_MOUNTED_DEVICE_GUID,
    NULL,
    // out "\??\ROOT#MYFS#0000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}"
    &fsDeviceName);
status = IoSetDeviceInterfaceState(&Dcb->fs_name, TRUE);

// Lets call IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER
status = mountmgr_add_drive_letter(mountmgrDeviceObject, &fsDeviceName);
dprintf("DriveLetterWasAssigned = %u, CurrentDriveLetter = %c\n", mmdli.DriveLetterWasAssigned, mmdli.CurrentDriveLetter);

// Lets call IOCTL_MOUNTMGR_QUERY_POINTS
status = mountmgr_get_drive_letter(mountmgrDeviceObject, &diskDeviceName);

dprintf("   point %d: '%.*S' '%.*S'\n", Index,
    ipoint->DeviceNameLength / sizeof(WCHAR), DeviceName,
    ipoint->SymbolicLinkNameLength / sizeof(WCHAR), SymbolicLinkName);
以及程序生成的输出:

** Run code:
WinDeviceObject : FFFFAA81D83CC060
diskDeviceObject: FFFFAA81D260A080
fsDeviceObject  : FFFFAA81D301EC40
=> SendVolumeArrivalNotification

# First requests come in, I don't really know what to do in CREATE/CLEANUP
# and CLOSE, so they mostly just return STATUS_SUCCESS

dispatcher: enter: major 0: minor 0: IRP_MJ_CREATE diskDeviceObject
IRP_MJ_CREATE: FileObject FFFFAA81D6AE8CC0 related 0000000000000000 name '(null)' flags 0x0
Setting FileObject->Vpb to FFFFAA81D559B590
dispatcher: exit: 0x0

dispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 0: minor 0: IRP_MJ_CREATE diskDeviceObject
IRP_MJ_CREATE: FileObject FFFFAA81D6AE8CC0 related 0000000000000000 name '(null)' flags 0x0
Setting FileObject->Vpb to FFFFAA81D559B590
dispatcher: exit: 0x0

dispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP deviceObject FFFFAA81D260A080
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
dispatcher: exit: STATUS_BUFFER_OVERFLOW

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
replying with '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
dispatcher: exit: STATUS_BUFFER_OVERFLOW

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
replying with '\DosDevices\Global\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_STABLE_GUID
dispatcher: exit: STATUS_NOT_IMPLEMENTED
# Doesn't sound like I want/need to use stable_guid, so skipping it


dispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 0: minor 0: IRP_MJ_CREATE diskDeviceObject
IRP_MJ_CREATE: FileObject FFFFAA81D6AE8CC0 related 0000000000000000 name '(null)' flags 0x0
Setting FileObject->Vpb to FFFFAA81D559B590
dispatcher: exit: 0x0

dispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
dispatcher: exit: STATUS_NOT_IMPLEMENTED
# Similarly here, should be ok to go without, right?

dispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 0: minor 0: IRP_MJ_CREATE diskDeviceObject
IRP_MJ_CREATE: FileObject FFFFAA81D6AE8CC0 related 0000000000000000 name '(null)' flags 0x0
Setting FileObject->Vpb to FFFFAA81D559B590
dispatcher: exit: 0x0

dispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP diskDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_VOLUME_ONLINE
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL diskDeviceObject
IOCTL_VOLUME_POST_ONLINE
dispatcher: exit: 0x0

dispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE diskDeviceObject

dispatcher: exit: 0x0

<= SendVolumeArrivalNotification

IoReportDetectedDevice success
IoAttachDeviceToDeviceStack success

# Reply to GUID_DEVINTERFACE_DISK
IoRegisterDeviceInterface success: \??\ROOT#MYFS#0000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
IoSetDeviceInterfaceState success

# Reply to MOUNTDEV_MOUNTED_DEVICE_GUID
IoRegisterDeviceInterface success: \??\ROOT#MYFS#0000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
IoSetDeviceInterfaceState success

# IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER work
mmdlt = \Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}

dispatcher: enter: major 0: minor 0: IRP_MJ_CREATE fsDeviceObject
IRP_MJ_CREATE: FileObject FFFFAA81D2958390 related 0000000000000000 name '(null)' flags 0x0
Setting FileObject->Vpb to FFFFAA81D559B590
dispatcher: exit: 0x0

dispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP fsDeviceObject
dispatcher: exit: 0x0

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL fsDeviceObject
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
dispatcher: exit: STATUS_BUFFER_OVERFLOW

dispatcher: enter: major 14: minor 0: IRP_MJ_DEVICE_CONTROL fsDeviceObject
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
replying with '\Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
dispatcher: exit: 0x0

dispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE fsDeviceObject
dispatcher: exit: 0x0

DriveLetterWasAssigned = 0, CurrentDriveLetter = D
# Oh, claims it has a drive letter?

IOCTL_MOUNTMGR_QUERY_POINTS return 0
point 0: '\Device\HarddiskVolume1' '\??\Volume{168821f0-0000-0000-0000-100000000000}'
point 1: '\Device\HarddiskVolume2' '\DosDevices\C:'
point 2: '\Device\HarddiskVolume2' '\??\Volume{168821f0-0000-0000-0000-501f00000000}'
point 3: '\Device\Floppy0' '\DosDevices\A:'
point 4: '\Device\Floppy0' '\??\Volume{ffc72bda-0526-11e7-ba78-806e6f6e6963}'
point 5: '' '\??\Volume{5d761629-339b-11e7-baa7-ab3bc3128e46}'
point 6: '' '\DosDevices\D:'
**运行代码:
风电设备对象:FFFFAA81D83CC060
diskDeviceObject:FFFFAA81D260A080
fsDeviceObject:FFFFAA81D301EC40
=>SendVolumeArrivalNotification
#第一个请求进来了,我真的不知道在创建/清理中该做什么
#而且很接近,所以他们大多只是返回状态和成功
dispatcher:enter:major 0:minor 0:IRP_MJ_创建diskDeviceObject
IRP_MJ_CREATE:FileObject ffffffffaa81d6ae8cc0相关0000000000000000名称'(null)'标志0x0
将FileObject->Vpb设置为FFFFAA81D559B590
调度程序:退出:0x0
dispatcher:enter:major 18:minor 0:IRP_MJ_CLEANUP diskDeviceObject
调度程序:退出:0x0
dispatcher:enter:major 2:minor 0:IRP_MJ_CLOSE diskDeviceObject
调度程序:退出:0x0
dispatcher:enter:major 0:minor 0:IRP_MJ_创建diskDeviceObject
IRP_MJ_CREATE:FileObject ffffffffaa81d6ae8cc0相关0000000000000000名称'(null)'标志0x0
将FileObject->Vpb设置为FFFFAA81D559B590
调度程序:退出:0x0
调度员:输入:主要18:次要0:IRP_MJ_清理设备对象FFFFAA81D260A080
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL\u MOUNTDEV\u查询\u设备\u名称
调度程序:退出:状态\缓冲区\溢出
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL\u MOUNTDEV\u查询\u设备\u名称
正在用“\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}”回复
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
调度程序:退出:状态\缓冲区\溢出
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
正在用“\DosDevices\Global\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}”回复
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL\u MOUNTDEV\u查询\u稳定\u GUID
调度程序:退出:状态\u未\u实现
#听起来我不想/需要使用稳定的guid,所以跳过它
dispatcher:enter:major 2:minor 0:IRP_MJ_CLOSE diskDeviceObject
调度程序:退出:0x0
dispatcher:enter:major 0:minor 0:IRP_MJ_创建diskDeviceObject
IRP_MJ_CREATE:FileObject ffffffffaa81d6ae8cc0相关0000000000000000名称'(null)'标志0x0
将FileObject->Vpb设置为FFFFAA81D559B590
调度程序:退出:0x0
dispatcher:enter:major 18:minor 0:IRP_MJ_CLEANUP diskDeviceObject
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL\u MOUNTDEV\u查询\u建议链接\u名称
调度程序:退出:状态\u未\u实现
#同样在这里,应该可以不用,对吧?
dispatcher:enter:major 2:minor 0:IRP_MJ_CLOSE diskDeviceObject
调度程序:退出:0x0
dispatcher:enter:major 0:minor 0:IRP_MJ_创建diskDeviceObject
IRP_MJ_CREATE:FileObject ffffffffaa81d6ae8cc0相关0000000000000000名称'(null)'标志0x0
将FileObject->Vpb设置为FFFFAA81D559B590
调度程序:退出:0x0
dispatcher:enter:major 18:minor 0:IRP_MJ_CLEANUP diskDeviceObject
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL_VOLUME_联机
调度程序:退出:0x0
调度程序:输入:主要14:次要0:IRP\U MJ\U设备\U控制磁盘设备对象
IOCTL\u卷\u发布\u在线
调度程序:退出:0x0
dispatcher:enter:major 2:minor 0:IRP_MJ_CLOSE diskDeviceObject
调度程序:退出:0x0
Vpb至FFFFAA81D559B590
调度程序:退出:0x0
调度程序:输入:主要18:次要0:IRP_MJ_清理fsDeviceObject
调度程序:退出:0x0
调度员:输入:主要14:次要0:IRP\U MJ\U设备\U控制fsDeviceObject
IOCTL\u MOUNTDEV\u查询\u设备\u名称
调度程序:退出:状态\缓冲区\溢出
调度员:输入:主要14:次要0:IRP\U MJ\U设备\U控制fsDeviceObject
IOCTL\u MOUNTDEV\u查询\u设备\u名称
正在以“\Device\Myfs{0b1bb601-af0b-32e8-a1d2-54c167af6277}”回复
调度程序:退出:0x0
调度程序:输入:主要2:次要0:IRP_MJ_关闭fsDeviceObject
调度程序:退出:0x0
DriveLetterWasAssigned=0,CurrentDriveLetter=D
#哦,声称它有一个驱动器号?
IOCTL\u MOUNTMGR\u查询\u点返回0
点0:“\Device\HarddiskVolume1”“\??\Volume{168821f0-0000-0000-0000-10000000000}”
第1点:'\Device\HarddiskVolume2'\DosDevices\C:'
第2点:“\Device\HarddiskVolume2”“\??\Volume{168821f0-0000-0000-0000-501f00000000}”
第3点:'\Device\Floppy0'\DosDevices\A:'
第4点:“\Device\Floppy0”“\??\Volume{ffc72bda-0526-11e7-ba78-806e6f6e6963}”
第5点:“\??\Volume{5d761629-339b-11e7-baa7-ab3bc3128e46}”
第6点:'\DosDevices\D:'
如果没有我的代码,我将只有0、1、2、3和4。看起来是这样 我已经创建了5和6。我不知道5是什么,卷GUID是这样的 不匹配代码或输出中的任何内容。6有“D:”像上面一样

“D:”的出现是令人鼓舞的,但应该是左边 (DeviceName)真的是空的吗?这就是我接下来要看的吗

或者是对IRP_MJ_CREATE的呼吁?我几乎什么也不做,只是回答 地位与成功。我确实将Vpb分配给FileObject,但这没有什么区别

什么是设备5?这是我的问题吗,是因为我 答复
  if (Status != STATUS_SUCCESS)
      Irp->IoStatus.Information = 0;
point 4: '\Device\Volume{0b1bb601-af0b-32e8-a1d2-54c167af6277}'
      '\DosDevices\D:'