因此,我正在嘗試編寫僅附加到特定USB設備的微過濾器驅動程序,以區分使用產品ID +供應商ID +序列號組合的上述設備。使用IOCTL_STORAGE_QUERY_PROPERTY獲取序列號
我可以成功地將IOCTL_STORAGE_QUERY_PROPERTY發送到返回產品ID,供應商ID,序列號的設備。
我的問題是返回到我的微過濾器的序列號對於某些USB接口是正確的,但並非全部。
例如:當我打電話
C:\Windows\system32>wmic diskdrive get pnpdeviceid PNPDeviceID USBSTOR\DISK&VEN_SONY&PROD_STORAGE_MEDIA&REV_PMAP\5C3000637C2070A595&0 USBSTOR\DISK&VEN_BM&PROD_&REV_1.10\070007AA1F02CF40063F&0
而這些序列號從我的微過濾器返回:
Serial Number found 57C03A050905. Serial Number found 070007AA1F02CF400630.
因爲它可以看出,第二個設備的序列號成功返回,但不是第一個。那麼我的微過濾器正在接收的序列號是什麼?這是否存儲在可以查詢的地方?
如果需要,我可以附上代碼,但由於我正確地得到了一些序列號,我懷疑我的代碼是錯誤的。
編輯:代碼
STORAGE_PROPERTY_QUERY query;
pQuery.PropertyId = StorageDeviceProperty;
pQuery.QueryType = PropertyStandardQuery
KeInitializeEvent(&event, NotificationEvent, FALSE);
Irp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, pDeviceObject, (PVOID)&query, sizeof(query), infoBuffer,
sizeof(infoBuffer), FALSE, &event, &ioStatusBlock);
if (Irp) {
if(!NT_SUCCESS(IoCallDriver(pDeviceObject, Irp)))
return STATUS_FLT_DO_NOT_ATTACH;
}
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
pDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)infoBuffer;
ULONG offset = pDescriptor->SerialNumberOfffset;
size_t size;
if (offset == 0)
return;
PCHAR c = offset + &buffer[0];
size = strlen(c);
*dest = ExAllocatePoolWithTag(PagedPool, size + 1, 'DIcI');
RtlZeroMemory(*dest, size + 1);
RtlCopyMemory(*dest, c, size + 1);
DbgPrint("Serial Number Found %s \n", *dest);
// String comparison of serial number and more processing
在我的外部硬盤進行測試,這是我從設備管理器
575834314137363534565656
得到和我的微過濾器:
WX41A7654VVV
似乎設備管理器中的序列號是我從微過濾器獲得的序列號的十六進制表示
57 58 34 31 41 37 36 35 34 56 56 56
W X 4 1 A 7 6 5 4 V V V
因此對於某些設備,它以十六進制格式表示,而其他設備是Char格式?
因此,無論如何,從內核級別獲取序列號或者它會更容易調用用戶應用程序?
'...因爲我正確地得到一些序列號,我懷疑我的代碼是wrong'這是一種思維完全錯誤的方式...發佈您的代碼,並詢問是否有人能夠發現的bug – 4386427
編輯的orignal post添加代碼 – qwn
'infoBuffer,sizeof(infoBuffer)' - 這表示您使用硬編碼數組作爲'infoBuffer' - 這已經是錯誤。它的大小未知,你需要在運行時查詢它。正確的代碼 - https://stackoverflow.com/a/44656144/6401656 – RbMm