此问题是由于硬件(如驱动器控制器)造成的。如果底层硬件返回的字节数不在0x00-0x04的范围内,则会出现此问题。
解决此问题的一种方法是使用IOCTL_DISK_GET_DRIVE_GEOMETRY_EX命令查询驱动器信息并将其发送到DBT_ACDeviceArrival通知。以下是一个示例:
#include
#include
#include
#include
void OnDeviceChange (WPARAM wParam, LPARAM lParam) {
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) lParam;
switch (wParam) {
case DBT_DEVICEARRIVAL:
if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) {
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME) lParam;
HANDLE hDevice = CreateFile (TEXT("\\\\.\\PhysicalDrive0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice != INVALID_HANDLE_VALUE) {
DWORD cbBytesReturned;
DISK_GEOMETRY_EX dgx;
if (DeviceIoControl (hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, &dgx, sizeof (dgx), &cbBytesReturned, NULL)) {
printf ("Bytes per sector = %u\n", dgx.Geometry.BytesPerSector);
}
CloseHandle (hDevice);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
break;
}
}
int WINAPI _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int iCmdShow) {
WNDCLASS wc = {0};
wc.lpfnWndProc = DefWindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = TEXT("HiddenWindow");
if (!RegisterClass(&wc)) {
return