wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2349回复:4

如何在IRP_MJ_READ中得到文件的内容,求救!

楼主#
更多 发布于:2003-05-22 10:09
为了在虚拟磁盘中对不同的文件用不同的分组密码加密,在filemon中的IRP_MJ_READ中可以得到文件名,现在我想得到文件内容,就可以针对不同的文件加密。可以我在IRP_MJ_READ中构造一个IRP传到下层得到文件内容时,机器就没有响应了。我的程序有什么问题,请指教。或者有什么更好的方法。

PIRP MyIrp;
KEVENT event;
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION nextStackLocation;
PVOID MyreadBuffer;
ULONG MyreadBufferLength;
hookExt = HookDevice->DeviceExtension;
FileObject = currentIrpStack->FileObject;

case IRP_MJ_READ:

KeInitializeEvent(&event, SynchronizationEvent, FALSE);
MyIrp= IoAllocateIrp(HookDevice->StackSize, FALSE);

if(!MyIrp) {
    return FALSE;
}

MyreadBuffer = ExAllocatePool(NonPagedPool,1024);

MyIrp->AssociatedIrp.SystemBuffer =MyreadBuffer;
MyIrp->UserEvent = &event;
MyIrp->UserIosb = &IoStatusBlock;
MyIrp->Tail.Overlay.Thread = PsGetCurrentThread();
MyIrp->Tail.Overlay.OriginalFileObject = FileObject;
MyIrp->RequestorMode = KernelMode;
MyIrp->Flags = 0;

nextStackLocation = IoGetNextIrpStackLocation(MyIrp);
nextStackLocation->MajorFunction = IRP_MJ_READ;
nextStackLocation->DeviceObject = HookDevice;
nextStackLocation->FileObject = FileObject;
nextStackLocation->Parameters.QueryFile.Length =1024;
            
IoSetCompletionRoutine(MyIrp, ReadCompleted, 0, TRUE, TRUE, TRUE);
(void) IoCallDriver(hookExt->FileSystem, MyIrp);

KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);
return NT_SUCCESS( IoStatusBlock.Status);
break;


NTSTATUS
ReadCompleted(
    PDEVICE_OBJECT DeviceObject,
  PIRP Irp
)
{
 
  PIO_STACK_LOCATION  IrpStack;
  IrpStack = IoGetCurrentIrpStackLocation(Irp);
  DebugPrint(\"IRP %I.Reading %u bytes from %x\",
Irp,IrpStack->Parameters.Read.Length,
Irp->AssociatedIrp.SystemBuffer);
  if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
  return Irp->IoStatus.Status;

}

最新喜欢:

rhpengrhpeng
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-23 09:32
RtlMoveMemory(IrpNextStack,IrpCurStack,sizeof(IO_STACK_LOCATION));
改成:
*IrpNextStack=*IrpCurStack;
不限容量的免费邮箱 www.k65.net
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-23 08:43
vcmfc,我改成这样还是死机.为什么?
IrpCurStack=IoGetCurrentIrpStackLocation(Irp);
IrpNextStack=IoGetNextIrpStackLocation(Irp);
RtlMoveMemory(IrpNextStack,IrpCurStack,sizeof(IO_STACK_LOCATION));
if( (Irp->Flags & IRP_NOCACHE) || (Irp->Flags & IRP_PAGING_IO) || (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) )
{
IoSetCompletionRoutine( Irp , ReadCompleted , NULL ,TRUE ,TRUE ,TRUE );
IoCallDriver( hookExt->FileSystem , Irp );
}

NTSTATUS
ReadCompleted(
    PDEVICE_OBJECT DeviceObject,
PIRP Irp
)
{
PIO_STACK_LOCATION  IrpStack;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
DebugPrint(\"IRP  yang\");
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
return STATUS_SUCCESS;
}
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-22 17:25
我们老板的要求是,做一个虚拟的分区,分区中不同的文件用不同的密钥进行分组算法加密。无论是.txt,.doc,还是.exe,.rm。要求是在分区中可以打开,对用户进行透明的加解密。在这里加密是对扇区而言的吗?我现在只能在filedisk基础上做到对分区级的加密,想在filemon的基础上做到对文件级的加密。扇区级的还没想到。我看过一些你的帖子,很受启发,还要请你多请教。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-22 16:07
无须自已构造,将这个IRP传下去,设置完成例程,在完成例程里加密。

跟我做的一个东东完全一样。不同文件使用不同的密钥。。。。你会吐血的。

你是不是要加密Microsoft Office文档。 :D :D :D :D :D
游客

返回顶部