阅读:1592回复:3
在网上看到自己构造IRP的代码,但是搞不懂参数什么意思,请老大门给指点
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参数应该是什么值?请老大门给点详细的解释 |
|
最新喜欢:![]() |
沙发#
发布于:2007-04-07 16:56
同样关注
|
|
板凳#
发布于:2007-04-20 15:07
再次关注
![]() |
|
地板#
发布于:2007-04-22 21:53
建议你用devicetree查看一下卷管理器驱动ftdisk.sys的卷设备对象,其中就有相应的域
|
|