2016-11-15 3 views
0

J'ai une question à propos de l'exemple KMDF Ramdisk de Microsoft.Créer plusieurs ramdisk KMDF

Comment créer plus d'un périphérique de disque virtuel? Comment le gestionnaire de PnP sait-il appeler EvtDeviceAdd et puis-je contrôler combien de fois il est appelé?

WdfDeviceCreate() est utilisé pour créer un périphérique ramdisk dans RamDiskEvtDeviceAdd(), mais je ne peux pas installer plus d'une instance de ce pilote de disque 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; 
 

Aidez-moi s'il vous plaît! Merci

+0

Bienvenue. Veuillez donner un exemple de ce que vous essayez de faire pour mieux vous aider. –

Répondre

0

Je comprends que c'est un vieux message, mais puisqu'il n'y a pas de réponses utiles, j'ai pensé que je pourrais ajouter mes pensées.

EvtDeviceAdd est appelée par la structure KMDF lorsqu'un périphérique correspond à un ID matériel pris en charge par votre INF. (https://msdn.microsoft.com/en-us/library/windows/hardware/ff541693%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396). Selon la documentation VirtualVolume (https://code.msdn.microsoft.com/windowshardware/VirtualVolume-83334efd), la seule façon de créer un périphérique est d'appeler devcon install virtvol.inf virtvol.

Vous pouvez créer plusieurs RAMDisks en appelant plusieurs fois le devcon install.