www.pudn.com > truecrypt.zip > NTFILEDV.C


/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org 
   This product uses components written by Paul Le Roux  */ 
 
#include "TCdefs.h" 
#include "crypto.h" 
#include "fat.h" 
#include "volumes.h" 
 
#include "apidrvr.h" 
#include "ntdriver.h" 
#include "ntvol.h" 
#include "ntfiledv.h" 
 
#pragma warning( disable : 4127 ) 
 
TCSendIRP_FileDevice (PDEVICE_OBJECT DeviceObject, 
		       PEXTENSION Extension, 
		       PVOID pUserBuffer, 
		       ULONG uFlags, 
		       UCHAR uMajorFunction, 
		       PIRP Irp) 
{ 
	PIO_STACK_LOCATION irpOldSp; 
	NTSTATUS ntStatus; 
	PIRP NewIrp; 
 
//	Dump ("Sending IRP...\n"); 
 
	NewIrp = IoAllocateIrp ((CCHAR) (Extension->pFsdDevice->StackSize + 1), FALSE); 
 
	irpOldSp = IoGetCurrentIrpStackLocation (Irp); 
 
	if (NewIrp != NULL) 
	{ 
		PIO_STACK_LOCATION irpSp, irpNextSp; 
 
		NewIrp->UserEvent = NULL; 
		NewIrp->UserIosb = &Irp->IoStatus; 
 
		/* Doc's say to copy the Tail.Overlay.Thread from the 
		   original Irp but if I do this the user is not prompted on 
		   media removed and other user conditions! */ 
		NewIrp->Tail.Overlay.Thread = PsGetCurrentThread (); 
		NewIrp->Tail.Overlay.OriginalFileObject = Extension->pfoDeviceFile; 
		NewIrp->RequestorMode = KernelMode; 
 
		NewIrp->Flags = uFlags; 
 
		NewIrp->AssociatedIrp.SystemBuffer = NULL; 
		NewIrp->MdlAddress = NULL; 
		NewIrp->UserBuffer = pUserBuffer; 
 
		IoSetNextIrpStackLocation (NewIrp); 
 
		irpSp = IoGetCurrentIrpStackLocation (NewIrp); 
		irpNextSp = IoGetNextIrpStackLocation (NewIrp); 
 
		irpSp->DeviceObject = DeviceObject; 
		irpSp->FileObject = Extension->pfoDeviceFile; 
 
		irpNextSp->MajorFunction = irpSp->MajorFunction = uMajorFunction; 
		irpNextSp->MinorFunction = irpSp->MinorFunction = irpSp->MinorFunction; 
		irpNextSp->DeviceObject = Extension->pFsdDevice; 
		irpNextSp->FileObject = Extension->pfoDeviceFile; 
		/* Copy our flags down one level, this is to get the proper 
		   removable-media handling */ 
		irpNextSp->Flags = irpSp->Flags = irpOldSp->Flags; 
		/* Copy over io parameters, this is a union, so it handles 
		   deviceiocontrol & read/write */ 
		irpNextSp->Parameters.Read.Length = irpSp->Parameters.Read.Length = irpOldSp->Parameters.Read.Length; 
		irpNextSp->Parameters.Read.ByteOffset = irpSp->Parameters.Read.ByteOffset = irpOldSp->Parameters.Read.ByteOffset; 
		irpNextSp->Parameters.Read.Key = irpSp->Parameters.Read.Key = irpOldSp->Parameters.Read.Key; 
	} 
	else 
	{ 
		TCfree (pUserBuffer);	/* Free the temp buffer we allocated 
					   for the IRP */ 
 
		/* Complete the processing of the original Irp */ 
		return COMPLETE_IRP (DeviceObject, Irp, STATUS_INSUFFICIENT_RESOURCES, 0); 
	} 
 
	IoSetCompletionRoutine (NewIrp, TCCompletion, Irp, TRUE, TRUE, TRUE); 
 
	ntStatus = IoCallDriver (Extension->pFsdDevice, NewIrp); 
	//if (ntStatus == STATUS_PENDING) 
	//{ 
	//	Dump ("Pending returned!\n"); 
	//} 
 
//	Dump ("IRP Sent!\n"); 
	return ntStatus; 
}