阅读:1710回复:3
帮忙看看
我想自己发送SCSIOP_WRITE,总是不成功,为什么
NTSTATUS MyScsiWriteCompletion ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT SynchronizingEvent ) { *Irp->UserIosb = Irp->IoStatus; if (STATUS_SUCCESS != Irp->IoStatus.Status) { dprintf("[UsbFilter] MyScsiWriteCompletion : FAILED.\n"); } KeSetEvent( SynchronizingEvent, IO_NO_INCREMENT, FALSE ); IoFreeIrp( Irp ); return STATUS_MORE_PROCESSING_REQUIRED; } BOOL MyScsiWriteIRP( IN PDEVICE_OBJECT NextDeviceObject, IN PBYTE pBuffer ) { PIRP irp = NULL; PIO_STACK_LOCATION irpSp = NULL; IO_STATUS_BLOCK ioStatusBlock; KEVENT event; NTSTATUS status; SCSI_REQUEST_BLOCK Srb; PCDB cdb; PVOID Buffer; Buffer = ExAllocateFromNPagedLookasideList(&g_CtxLookAsideList); RtlCopyMemory(Buffer, pBuffer, 512); RtlZeroMemory(&Srb, sizeof(SCSI_REQUEST_BLOCK)); Srb.Length = SCSI_REQUEST_BLOCK_SIZE; Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; Srb.QueueAction = 0x20; Srb.CdbLength = 0x0A; Srb.SrbFlags = 0x200280; Srb.DataTransferLength = 512; Srb.TimeOutValue = 10; Srb.Cdb[0] = SCSIOP_WRITE; Srb.Cdb[8] = 0x01; Srb.DataBuffer = Buffer; KeInitializeEvent( &event, NotificationEvent, FALSE ); ioStatusBlock.Status = STATUS_SUCCESS; ioStatusBlock.Information = 0; irp = IoAllocateIrp( NextDeviceObject->StackSize, FALSE ); irp->Tail.Overlay.Thread = PsGetCurrentThread(); irp->RequestorMode = KernelMode; irp->UserIosb = &ioStatusBlock; irp->UserEvent = NULL; irp->Flags = IRP_SYNCHRONOUS_API; irpSp = IoGetNextIrpStackLocation( irp ); irpSp->MajorFunction = IRP_MJ_SCSI ; irpSp->MinorFunction = 0; irpSp->Parameters.Scsi.Srb = &Srb; IoSetCompletionRoutine( irp, MyScsiWriteCompletion, &event, TRUE, TRUE, TRUE ); status = IoCallDriver( NextDeviceObject, irp ); if (STATUS_PENDING == status) { KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL ); } ExFreeToNPagedLookasideList(&g_CtxLookAsideList, Buffer); return NT_SUCCESS(ioStatusBlock.Status); } 在IRP_MJ_SISC例程中SCSIOP_WRITE操作中 KeInitializeEvent(&Event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)FilterScsiReadWriteCompletionRoutine, &Event, TRUE, TRUE, TRUE); status = IoCallDriver(deviceExtension->NextLowerDriver, Irp); if (STATUS_PENDING == status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); status = Irp->IoStatus.Status; } MyScsiWriteIRP(deviceExtension->NextLowerDriver, Buffer); 意思就是在SCSIOP_WRITE完成后自己再发送一个WRITE,为什么总是失败啊,能给指点下吗 |
|
|
沙发#
发布于:2008-07-07 14:19
What's the error?
|
|
|
板凳#
发布于:2008-07-07 14:27
又写机器狗?没用的
|
|
|
地板#
发布于:2008-07-07 14:50
你怎么知道人是机器狗,不会是机器猫?
|
|
|