|
|
1.1 ! root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org ! 2: This product uses components written by Paul Le Roux <[email protected]> */ ! 3: ! 4: #include "TCdefs.h" ! 5: #include "crypto.h" ! 6: #include "fat.h" ! 7: #include "volumes.h" ! 8: ! 9: #include "apidrvr.h" ! 10: #include "ntdriver.h" ! 11: #include "ntvol.h" ! 12: #include "ntfiledv.h" ! 13: ! 14: #pragma warning( disable : 4127 ) ! 15: ! 16: TCSendIRP_FileDevice (PDEVICE_OBJECT DeviceObject, ! 17: PEXTENSION Extension, ! 18: PVOID pUserBuffer, ! 19: ULONG uFlags, ! 20: UCHAR uMajorFunction, ! 21: PIRP Irp) ! 22: { ! 23: PIO_STACK_LOCATION irpOldSp; ! 24: NTSTATUS ntStatus; ! 25: PIRP NewIrp; ! 26: ! 27: // Dump ("Sending IRP...\n"); ! 28: ! 29: NewIrp = IoAllocateIrp ((CCHAR) (Extension->pFsdDevice->StackSize + 1), FALSE); ! 30: ! 31: irpOldSp = IoGetCurrentIrpStackLocation (Irp); ! 32: ! 33: if (NewIrp != NULL) ! 34: { ! 35: PIO_STACK_LOCATION irpSp, irpNextSp; ! 36: ! 37: NewIrp->UserEvent = NULL; ! 38: NewIrp->UserIosb = &Irp->IoStatus; ! 39: ! 40: /* Doc's say to copy the Tail.Overlay.Thread from the ! 41: original Irp but if I do this the user is not prompted on ! 42: media removed and other user conditions! */ ! 43: NewIrp->Tail.Overlay.Thread = PsGetCurrentThread (); ! 44: NewIrp->Tail.Overlay.OriginalFileObject = Extension->pfoDeviceFile; ! 45: NewIrp->RequestorMode = KernelMode; ! 46: ! 47: NewIrp->Flags = uFlags; ! 48: ! 49: NewIrp->AssociatedIrp.SystemBuffer = NULL; ! 50: NewIrp->MdlAddress = NULL; ! 51: NewIrp->UserBuffer = pUserBuffer; ! 52: ! 53: IoSetNextIrpStackLocation (NewIrp); ! 54: ! 55: irpSp = IoGetCurrentIrpStackLocation (NewIrp); ! 56: irpNextSp = IoGetNextIrpStackLocation (NewIrp); ! 57: ! 58: irpSp->DeviceObject = DeviceObject; ! 59: irpSp->FileObject = Extension->pfoDeviceFile; ! 60: ! 61: irpNextSp->MajorFunction = irpSp->MajorFunction = uMajorFunction; ! 62: irpNextSp->MinorFunction = irpSp->MinorFunction = irpSp->MinorFunction; ! 63: irpNextSp->DeviceObject = Extension->pFsdDevice; ! 64: irpNextSp->FileObject = Extension->pfoDeviceFile; ! 65: /* Copy our flags down one level, this is to get the proper ! 66: removable-media handling */ ! 67: irpNextSp->Flags = irpSp->Flags = irpOldSp->Flags; ! 68: /* Copy over io parameters, this is a union, so it handles ! 69: deviceiocontrol & read/write */ ! 70: irpNextSp->Parameters.Read.Length = irpSp->Parameters.Read.Length = irpOldSp->Parameters.Read.Length; ! 71: irpNextSp->Parameters.Read.ByteOffset = irpSp->Parameters.Read.ByteOffset = irpOldSp->Parameters.Read.ByteOffset; ! 72: irpNextSp->Parameters.Read.Key = irpSp->Parameters.Read.Key = irpOldSp->Parameters.Read.Key; ! 73: } ! 74: else ! 75: { ! 76: TCfree (pUserBuffer); /* Free the temp buffer we allocated ! 77: for the IRP */ ! 78: ! 79: /* Complete the processing of the original Irp */ ! 80: return COMPLETE_IRP (DeviceObject, Irp, STATUS_INSUFFICIENT_RESOURCES, 0); ! 81: } ! 82: ! 83: IoSetCompletionRoutine (NewIrp, TCCompletion, Irp, TRUE, TRUE, TRUE); ! 84: ! 85: ntStatus = IoCallDriver (Extension->pFsdDevice, NewIrp); ! 86: //if (ntStatus == STATUS_PENDING) ! 87: //{ ! 88: // Dump ("Pending returned!\n"); ! 89: //} ! 90: ! 91: // Dump ("IRP Sent!\n"); ! 92: return ntStatus; ! 93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.