创建多个虚拟盘KMDF

问题描述:

我有一个关于微软的KMDF Ramdisk的样品问题。创建多个虚拟盘KMDF

如何创建多个ramdisk设备? PnP管理员如何知道调用EvtDeviceAdd,并且我可以控制它被调用的次数?

WdfDeviceCreate()用于在RamDiskEvtDeviceAdd()中创建ramdisk设备,但我无法安装此ramdisk驱动程序的多个实例。

 

NTSTATUS 
RamDiskEvtDeviceAdd(
    IN WDFDRIVER Driver, 
    IN PWDFDEVICE_INIT DeviceInit 
    ) { 
    WDF_OBJECT_ATTRIBUTES deviceAttributes; 
    NTSTATUS    status; 
    WDFDEVICE    device; 
    WDF_OBJECT_ATTRIBUTES queueAttributes; 
    WDF_IO_QUEUE_CONFIG  ioQueueConfig; 
    PDEVICE_EXTENSION  pDeviceExtension; 
    PQUEUE_EXTENSION  pQueueContext = NULL; 
    WDFQUEUE    queue; 
    DECLARE_CONST_UNICODE_STRING(ntDeviceName, NT_DEVICE_NAME); 
    DECLARE_CONST_UNICODE_STRING(MY_SDDL_STRING, L"D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;WD)(A;;GA;;;RC)"); 

    PAGED_CODE(); 

    UNREFERENCED_PARAMETER(Driver); 
    // Set name 
    status = WdfDeviceInitAssignName(DeviceInit, &ntDeviceName); 
    if (!NT_SUCCESS(status)) { 
     return status; 
    } 
    // Set permission 
    status = WdfDeviceInitAssignSDDLString(DeviceInit, &MY_SDDL_STRING); 
    if (!NT_SUCCESS(status)) { 
     return status; 
    } 
    WdfDeviceInitSetDeviceType(DeviceInit, FILE_DEVICE_DISK); 
    WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect); 
    WdfDeviceInitSetExclusive(DeviceInit, FALSE); 

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_EXTENSION); 
    deviceAttributes.EvtCleanupCallback = RamDiskEvtDeviceContextCleanup; 

    status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); 
    if (!NT_SUCCESS(status)) { 
     return status; 
    } 

    pDeviceExtension = DeviceGetExtension(device); 

    WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE (
     &ioQueueConfig, 
     WdfIoQueueDispatchSequential 
     ); 

    ioQueueConfig.EvtIoDeviceControl = RamDiskEvtIoDeviceControl; 
    ioQueueConfig.EvtIoRead   = RamDiskEvtIoRead; 
    ioQueueConfig.EvtIoWrite   = RamDiskEvtIoWrite; 

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&queueAttributes, QUEUE_EXTENSION); 

    __analysis_assume(ioQueueConfig.EvtIoStop != 0); 
    status = WdfIoQueueCreate(device, 
           &ioQueueConfig, 
           &queueAttributes, 
           &queue); 
    __analysis_assume(ioQueueConfig.EvtIoStop == 0); 
    if (!NT_SUCCESS(status)) { 
     return status; 
    } 

    // Context is the Queue handle 
    pQueueContext = QueueGetExtension(queue); 

    // Set the context for our default queue as our device extension. 
    pQueueContext->DeviceExtension = pDeviceExtension; 

    // Now do any RAM-Disk specific initialization 
    pDeviceExtension->DiskRegInfo.DriveLetter.Buffer = 
     (PWSTR) &pDeviceExtension->DriveLetterBuffer; 
    pDeviceExtension->DiskRegInfo.DriveLetter.MaximumLength = 
     sizeof(pDeviceExtension->DriveLetterBuffer); 

    // Get the disk parameters from the registry 
    RamDiskQueryDiskRegParameters(
     WdfDriverGetRegistryPath(WdfDeviceGetDriver(device)), 
     &pDeviceExtension->DiskRegInfo 
     ); 

    // Allocate memory for the disk image. 
    pDeviceExtension->DiskImage = ExAllocatePoolWithTag(
     NonPagedPool, 
     pDeviceExtension->DiskRegInfo.DiskSize, 
     RAMDISK_TAG 
     ); 

    if (pDeviceExtension->DiskImage) { 

     UNICODE_STRING deviceName; 
     UNICODE_STRING win32Name; 

     RamDiskFormatDisk(pDeviceExtension); 

     status = STATUS_SUCCESS; 

     // Now try to create a symbolic link for the drive letter. 
     RtlInitUnicodeString(&win32Name, DOS_DEVICE_NAME); 
     RtlInitUnicodeString(&deviceName, NT_DEVICE_NAME); 

     pDeviceExtension->SymbolicLink.Buffer = (PWSTR) 
      &pDeviceExtension->DosDeviceNameBuffer; 
     pDeviceExtension->SymbolicLink.MaximumLength = 
      sizeof(pDeviceExtension->DosDeviceNameBuffer); 
     pDeviceExtension->SymbolicLink.Length = win32Name.Length; 

     RtlCopyUnicodeString(&pDeviceExtension->SymbolicLink, &win32Name); 
     RtlAppendUnicodeStringToString(&pDeviceExtension->SymbolicLink, 
             &pDeviceExtension->DiskRegInfo.DriveLetter); 

     status = WdfDeviceCreateSymbolicLink(device, 
              &pDeviceExtension->SymbolicLink); 
    } 

    return status; 
 

请帮帮我!由于

+0

欢迎。请举例说明你正在努力做什么,以便我们能够更好地帮助你。 –

我明白这是一个古老的职位,但因为没有有用的答案,我想我可能会增加我的想法。

EvtDeviceAdd是当一个设备,你的INF支持硬件ID相匹配的KMDF框架调用。 (https://msdn.microsoft.com/en-us/library/windows/hardware/ff541693%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)。

根据VirtualVolume文档(https://code.msdn.microsoft.com/windowshardware/VirtualVolume-83334efd),创建设备的唯一方法是调用devcon install virtvol.inf virtvol

你可以通过调用devcon install多次进行多次的ramdisk。