smallcat0008
驱动牛犊
驱动牛犊
  • 注册日期2004-08-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分504分
  • 威望62点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
阅读:1591回复:3

在网上看到自己构造IRP的代码,但是搞不懂参数什么意思,请老大门给指点

楼主#
更多 发布于:2007-04-02 19:00
  NTSTATUS IrpCreate(IN PUNICODE_STRING Name,IN ACCESS_MASK DesiredAccess,IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PDEVICE_OBJECT DeviceObject,IN PDEVICE_OBJECT RealDevice,IN PFILE_OBJECT RelatedFileObject,OUT PHANDLE ReturnHandle,PVOID* ReturnObject)
{
     NTSTATUS Status;  
     KEVENT Event;  
     PIRP pIrp;  
     PFILE_OBJECT FileObject;
     IO_STATUS_BLOCK      IoStatusBlock;
     PIO_STACK_LOCATION IOStack;
     IO_SECURITY_CONTEXT IoSecurityContext;
     ACCESS_STATE AccessState;
     AUX_DATA AuxData;
     PGENERIC_MAPPING pGenericMapping;
     OBJECT_ATTRIBUTES ObjectAttributs;
 
     KeInitializeEvent(&Event,SynchronizationEvent,FALSE);  
     pIrp = IoAllocateIrp(DeviceObject->StackSize,FALSE);
     if(pIrp==NULL)return STATUS_INSUFFICIENT_RESOURCES;
     InitializeObjectAttributes(&ObjectAttributs,NULL,OBJ_CASE_INSENSITIVE,0,NULL);
     Status = ObCreateObject(KernelMode,*IoFileObjectType,&ObjectAttributs,KernelMode,NULL,sizeof(FILE_OBJECT),0,0,(PVOID*)&FileObject);  
     if(!NT_SUCCESS(Status))
     {
           IoFreeIrp(pIrp);
           return Status;
     }  
     memset(FileObject,0,sizeof(FILE_OBJECT));
     FileObject->Type=5;
     FileObject->Size=sizeof(FILE_OBJECT);
     FileObject->Flags=FO_SYNCHRONOUS_IO;
     FileObject->DeviceObject = RealDevice;
     FileObject->RelatedFileObject = RelatedFileObject;
     KeInitializeEvent(&FileObject->Lock,SynchronizationEvent,FALSE);
     KeInitializeEvent(&FileObject->Event,SynchronizationEvent,FALSE);
     FileObject->FileName.Buffer = (PWSTR)ExAllocatePool(NonPagedPool,Name->MaximumLength);
     RtlCopyUnicodeString(&FileObject->FileName,Name);
     pIrp->UserEvent=&Event;
     pIrp->UserIosb=&IoStatusBlock;
     pIrp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
     pIrp->Tail.Overlay.OriginalFileObject=FileObject;
     pIrp->RequestorMode=KernelMode;
     pIrp->Flags=IRP_CREATE_OPERATION|IRP_SYNCHRONOUS_API;
     pIrp->PendingReturned=FALSE;
     pIrp->Cancel=FALSE;
     pIrp->MdlAddress=NULL;
     pIrp->CancelRoutine=NULL;
     pIrp->Tail.Overlay.AuxiliaryBuffer=NULL;
     IOStack = IoGetNextIrpStackLocation(pIrp);
     IOStack->MajorFunction=IRP_MJ_CREATE;
     IOStack->DeviceObject=DeviceObject;
     IOStack->FileObject=FileObject;
     pGenericMapping = IoGetFileObjectGenericMapping();  
     SeCreateAccessState(&AccessState,&AuxData,DesiredAccess,pGenericMapping);
     IoSecurityContext.AccessState = &AccessState;
     IoSecurityContext.DesiredAccess = DesiredAccess;
     IoSecurityContext.SecurityQos=NULL;
     IoSecurityContext.FullCreateOptions=0;
     IOStack->Parameters.Create.SecurityContext=&IoSecurityContext;
     IOStack->Parameters.Create.Options=(CreateDisposition<<0x18)|CreateOptions;
     IOStack->Parameters.Create.FileAttributes = (USHORT)FileAttributes;  
     IOStack->Parameters.Create.ShareAccess = (USHORT)ShareAccess;
     IOStack->Parameters.Create.EaLength=0;
     IOStack->Context=NULL;
     IOStack->Control=SL_INVOKE_ON_CANCEL|SL_INVOKE_ON_SUCCESS|SL_INVOKE_ON_ERROR;
     IOStack->CompletionRoutine = IoCompletionRoutine;
     Status = IoCallDriver(DeviceObject,pIrp);
     if(Status == STATUS_PENDING)  
           KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
     Status=IoStatusBlock.Status;
     if(NT_SUCCESS(Status))
     {
           MyReferenceObject(FileObject);
     }
     return Status;
}

void MyReferenceObject(PFILE_OBJECT FileObject)
{  
     InterlockedIncrement(&FileObject->DeviceObject->ReferenceCount);
     if(FileObject->Vpb)
           InterlockedIncrement((volatile LONG*)&FileObject->Vpb->ReferenceCount);
}



其中
RealDevice
DeviceObject
RelatedFileObject参数应该是什么值?请老大门给点详细的解释

最新喜欢:

LeopardLeopar...
123abc
驱动牛犊
驱动牛犊
  • 注册日期2005-09-08
  • 最后登录2007-12-11
  • 粉丝0
  • 关注0
  • 积分590分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-07 16:56
同样关注
123abc
驱动牛犊
驱动牛犊
  • 注册日期2005-09-08
  • 最后登录2007-12-11
  • 粉丝0
  • 关注0
  • 积分590分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-20 15:07
再次关注
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-22 21:53
建议你用devicetree查看一下卷管理器驱动ftdisk.sys的卷设备对象,其中就有相应的域
游客

返回顶部