原文是:如何在 Windows NT / Windows 2000/Windows XP 中的弹出可移动媒体
f84K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6i4m8H3L8%4u0@1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3P5X3S2Q4x3X3c8U0L8W2)9J5c8X3E0T1i4K6u0r3x3e0j5#2y4K6t1I4i4K6u0r3P5X3S2Q4x3X3c8U0L8R3`.`.
是一段应用层的代码,经过编译运行确实弹出了我的U盘,然后我勉强试着将其改为了驱动代码,然后通过编译后,运行出现了问题。
(代码在后面)
可见打开设备是成功的,是在ZwDeviceIoControlFile(..FSCTL_LOCK_VOLUME..)锁定卷出现了问题,很明显在应用层代码DeviceIoControlFile函数是成功执行了的,但是在驱动层用ZwDeviceIoControlFile(..FSCTL_LOCK_VOLUME..)反而出问题了,我才疏学浅做了很多尝试依然不能解决这个问题。
(备注:问题已经解决了,解决方法和代码请看后面回复)
// Do this in a loop until a timeout period has expired
for (nTryCount = 0; nTryCount < LOCK_RETRIES; nTryCount++) {
if (DeviceIoControl(hVolume,
FSCTL_LOCK_VOLUME,
NULL, 0,
NULL, 0,
&dwBytesReturned,
NULL))
return TRUE;
DWORD dwSleepAmount=LOCK_TIMEOUT / LOCK_RETRIES;
int nTryCount;
LARGE_INTEGER Sleeptime=RtlConvertLongToLargeInteger(-10*1000*dwSleepAmount);
// Do this in a loop until a timeout period has expired
for (nTryCount = 0; nTryCount < LOCK_RETRIES; nTryCount++)
{
status = ZwDeviceIoControlFile(hVolume, //status=C00000BB STATUS_NOT_SUPPORTED
NULL,
NULL,
NULL,
&IoStatusBlock,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0
);
DbgPrint("LockVolume status:%x\n", status);
if (NT_SUCCESS(status))
return TRUE;
放一个在驱动中安全删除硬件的代码附件: usbremove-driver.rar
是根据这个应用层代码改的:原文如何在 Windows NT / Windows 2000/Windows XP 中的弹出可移动媒体
0a5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6i4m8H3L8%4u0@1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3P5X3S2Q4x3X3c8U0L8W2)9J5c8X3E0T1i4K6u0r3x3e0j5#2y4K6t1I4i4K6u0r3P5X3S2Q4x3X3c8U0L8R3`.`.