📄 ntfiledv.c
字号:
/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
This product uses components written by Paul Le Roux <pleroux@swprofessionals.com> */
#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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -