2016-11-15 97 views
0

我有一個關於微軟的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

歡迎。請舉例說明你正在努力做什麼,以便我們能夠更好地幫助你。 –

回答

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。