阅读:1344回复:9
去除"不安全的设备删除"
NTSTATUS
DDK_QueryCapabilities( IN PDEVICE_OBJECT PdoDeviceObject, IN PDEVICE_CAPABILITIES DeviceCapabilities ) { PIO_STACK_LOCATION nextStack; PIRP irp; NTSTATUS ntStatus; KEVENT event; PAGED_CODE(); irp = IoAllocateIrp(PdoDeviceObject->StackSize, FALSE); if (!irp) { return STATUS_INSUFFICIENT_RESOURCES; } //分配IO位置 nextStack = IoGetNextIrpStackLocation(irp); ASSERT(nextStack != NULL); nextStack->MajorFunction= IRP_MJ_PNP; nextStack->MinorFunction= IRP_MN_QUERY_CAPABILITIES; KeInitializeEvent(&event, NotificationEvent, FALSE); IoSetCompletionRoutine(irp, DDK_DeferIrpCompletion, &event, TRUE, TRUE, TRUE); nextStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities; //传送一个IRP给下一层驱动程序 //指向下一层驱动程序 ntStatus = IoCallDriver(PdoDeviceObject,irp); if (ntStatus == STATUS_PENDING) { // wait for irp to complete TRAP(); // first time we hit this //等待事件 KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL); } //去除"不安全设备删除" RtlZeroMemory( DeviceCapabilities, sizeof(DEVICE_CAPABILITIES) ); DeviceCapabilities->Size = sizeof(DEVICE_CAPABILITIES); DeviceCapabilities->Version = 1; DeviceCapabilities->Address = -1; DeviceCapabilities->UINumber = -1; DeviceCapabilities->SurpriseRemovalOK=TRUE; DeviceCapabilities->Removable=TRUE; DeviceCapabilities->EjectSupported=TRUE; DeviceCapabilities->WarmEjectSupported=TRUE; //释放IRP IoFreeIrp(irp); return STATUS_SUCCESS; } 我是这样写的,怎么好像不对啊?该怎么写 |
|
沙发#
发布于:2004-08-11 09:34
case IRP_MN_QUERY_CAPABILITIES:
{ pdc = irpStack->Parameters.DeviceCapabilities.Capabilities; if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES)) { ntStatus = STATUS_UNSUCCESSFUL; } pdc->SurpriseRemovalOK = TRUE; pdc->Removable = TRUE; IoCompleteRequest (Irp, IO_NO_INCREMENT ); break; [编辑 - 8/11/04 by zfw] |
|
|
板凳#
发布于:2004-08-11 16:25
是在电源管理里添加这段代码?
//电源管理 NTSTATUS D12_ProcessPowerIrp(....) |
|
地板#
发布于:2004-08-11 16:45
黑屏了,我是加在这里的:
switch (irpStack->MinorFunction) { case IRP_MN_QUERY_CAPABILITIES: { PDEVICE_CAPABILITIES pdc = irpStack->Parameters.DeviceCapabilities.Capabilities; if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES)) { ntStatus = STATUS_UNSUCCESSFUL; } pdc->SurpriseRemovalOK = TRUE; pdc->Removable = TRUE; IoCompleteRequest (Irp,IO_NO_INCREMENT); } break; //开始设备 case IRP_MN_START_DEVICE: |
|
地下室#
发布于:2004-08-12 10:00
我的很正常啊,最后还有一句D12_DecrementIoCount(DeviceObject);是和 D12_IncrementIoCount(DeviceObject);配对的。
|
|
|
5楼#
发布于:2004-08-12 11:15
好像还是不行,老大有没有邮箱,MSN?
|
|
6楼#
发布于:2004-08-12 11:15
好像还是不行,老大有没有邮箱,QQ,MSN?
|
|
7楼#
发布于:2004-08-12 16:25
我是在98的驱动源代码上修改的,我现在改成这样
case IRP_MN_QUERY_CAPABILITIES: { KEVENT event; PDEVICE_EXTENSION deviceExtension; //irpStack=IoGetCurrentIrpStackLocation(Irp); //deviceExtension=DeviceObject->DeviceExtension; PDEVICE_CAPABILITIES pdc = irpStack->Parameters.DeviceCapabilities.Capabilities; if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES)) { ntStatus = STATUS_UNSUCCESSFUL; break; } pdc->SurpriseRemovalOK = TRUE; pdc->Removable = TRUE; pdc->EjectSupported=TRUE; pdc->WarmEjectSupported=TRUE; Irp->IoStatus.Status = STATUS_SUCCESS; //IoCompleteRequest (Irp,IO_NO_INCREMENT); //D12_DecrementIoCount(DeviceObject); KeInitializeEvent(&event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp,D12_DeferIrpCompletion,&event, TRUE, TRUE, TRUE); //传送一个IRP给下一层驱动程序 //指向下一层驱动程序 deviceExtension=DeviceObject->DeviceExtension; ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,Irp); D12_KdPrint(("D12TEST.SYS: ntStatus from IoCallDriver to PCI = 0x%x\n", ntStatus)); if (ntStatus == STATUS_PENDING) { TRAP(); // first time we hit this KeWaitForSingleObject(&event,Suspended,KernelMode, FALSE, NULL); } } break; 这样的话,不会重启了,但是"不安全的设备删除"还是出现了???怎么回事 |
|
8楼#
发布于:2004-09-08 09:32
没人知道吗
|
|
9楼#
发布于:2004-09-10 13:43
解决了,结贴
|
|