Как перечислить серийный номер устройства хранения в драйвере файловой системы - PullRequest
0 голосов
/ 03 октября 2018

Я создал драйвер файловой системы, чтобы разрешить или заблокировать внешние устройства хранения в Windows.Для разрешения конкретного устройства мне нужно узнать серийный номер.Я использую PSTORAGE_DEVICE_DESCRIPTOR, чтобы узнать серийный номер, но он не будет работать для всех устройств (например: некоторые устройства отображают серийный номер в виде специального символа).Есть ли другой возможный способ найти серийный номер в драйвере файловой системы? Следующий раздел кода используется для запроса серийного номера

    char szBuff [1024];
    STORAGE_PROPERTY_QUERY Query;
    //STORAGE_DEVICE_DESCRIPTOR Buffer[4];
    NTSTATUS Status = STATUS_SUCCESS;

    PSTORAGE_DEVICE_DESCRIPTOR Descriptor=NULL;
    PIRP NewIrp2=NULL;
    PIO_STACK_LOCATION  NextIrpStack=NULL;
    IO_STATUS_BLOCK IoStatus;
    char szSptr[2]={'_','\0'};
    SIZE_T szLength = 0;
    Query.PropertyId = StorageDeviceProperty;// first set the query properties 
    Query.QueryType = PropertyStandardQuery;
KeInitializeEvent(&WaitEvent_newIrp, NotificationEvent, TRUE);// initialize the waitable event

    __try 
    {
        memset(szBuff,0,1024);

        NewIrp2=IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, StorageStackDeviceObject, 
                                               (PVOID)&Query,sizeof(STORAGE_PROPERTY_QUERY),
                                               szBuff,1024,  
                                               FALSE,&WaitEvent_newIrp,&IoStatus);

        if(NewIrp2==NULL)
        {
            return STATUS_SUCCESS;  
        }

        Status = IoCallDriver(StorageStackDeviceObject, NewIrp2);// send this irp to the storage device 

        if (Status == STATUS_PENDING)
        {
            KeWaitForSingleObject(&WaitEvent_newIrp, Executive, KernelMode, FALSE, NULL);
            Status =IoStatus.Status;
        }
    }
    __finally
    {
        //if(NT_SUCCESS(Status))
        if(szBuff!=NULL)
        {
            try
            {
                Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)szBuff;
                Descriptor->Size = sizeof(szBuff);
                uBusType = Descriptor->BusType; //Get the bus type.
            }
            except(EXCEPTION_EXECUTE_HANDLER) 
            {
                /* Error handling code */
            }
        }

         char pszStart[255];    

             if(Descriptor->SerialNumberOffset!=0)

                {
                     memset(pszStart,0,255);
             RtlStringCopyWorkerA(pszStart,255,((char*)(UINT_PTR)Descriptor+(DWORD32)Descriptor->SerialNumberOffset),255);
                      //pszStart condains the serial number

                 }


        }
...