阅读:1990回复:11
请教:发送IRP创建文件夹的问题( 参考IRP文件操作接口的终极实现)
我想在驱动中创建一个文件夹,参考IRP文件操作接口的终极实现里面的代码,但是创建不成功,错误码为C000000D,请大家帮我看看
PDEVICE_OBJECT lpDeviceObject; PDEVICE_OBJECT lpRealDevice; UNICODE_STRING Filename; RtlInitUnicodeString(&Filename, L"D:\\user11\\"); if (GetDriveObject('D', &lpDeviceObject, &lpRealDevice)) { ntstatus = FileCreate(&Filename, FILE_LIST_DIRECTORY | SYNCHRONIZE, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_CREATE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, lpDeviceObject, lpRealDevice /*lpFilebOject*/); } BOOL GetDriveObject(IN DWORD DriveNumber, OUT PDEVICE_OBJECT *DeviceObject, OUT PDEVICE_OBJECT *ReadDevice ) { WCHAR driveName[] = L"\\DosDevices\\A:\\"; UNICODE_STRING deviceName; HANDLE deviceHandle; OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK ioStatus; PFILE_OBJECT fileObject; NTSTATUS status; if (DriveNumber >= 'A' && DriveNumber <= 'Z') { driveName[12] = (CHAR)DriveNumber; } else if (DriveNumber >= 'a' && DriveNumber <= 'z') { driveName[12] = (CHAR)DriveNumber - 'a' + 'A'; } else { return FALSE; } RtlInitUnicodeString(&deviceName, driveName); InitializeObjectAttributes( &objectAttributes, &deviceName, OBJ_CASE_INSENSITIVE, NULL, NULL); status = IoCreateFile( &deviceHandle, SYNCHRONIZE | FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE, NULL, 0, CreateFileTypeNone, NULL, 0x100); if (!NT_SUCCESS(status)) { KdPrint(("Could not open drive %c: %x\n", DriveNumber, status)); return FALSE; } status = ObReferenceObjectByHandle( deviceHandle, FILE_READ_DATA, *IoFileObjectType, KernelMode, (PVOID*)&fileObject, NULL); if (!NT_SUCCESS(status)) { KdPrint(("Could not get fileobject from handle: %c\n", DriveNumber)); ZwClose(deviceHandle); return FALSE; } if (fileObject->Vpb == 0 || fileObject->Vpb->RealDevice == NULL) { ObDereferenceObject(fileObject); ZwClose(deviceHandle); return FALSE; } *DeviceObject = fileObject->Vpb->DeviceObject; *ReadDevice = fileObject->Vpb->RealDevice; ObDereferenceObject(fileObject); ZwClose(deviceHandle); return TRUE; } NTSTATUS FileCreate( IN PUNICODE_STRING FileName, IN ACCESS_MASK DesiredAccess, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT RealDevice /*OUT PVOID *Object*/) { NTSTATUS status; KEVENT event; PIRP irp; IO_STATUS_BLOCK ioStatus; PIO_STACK_LOCATION irpSp; IO_SECURITY_CONTEXT securityContext; ACCESS_STATE accessState; OBJECT_ATTRIBUTES objectAttributes; PFILE_OBJECT fileObject; AUX_ACCESS_DATA auxData; RtlZeroMemory(&auxData, sizeof(AUX_ACCESS_DATA)); KeInitializeEvent(&event, SynchronizationEvent, FALSE); irp = IoAllocateIrp(DeviceObject->StackSize, FALSE); if (irp == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE, 0, NULL); status = ObCreateObject(KernelMode, *IoFileObjectType, &objectAttributes, KernelMode, NULL, sizeof(FILE_OBJECT), 0, 0, (PVOID *)&fileObject); if (!NT_SUCCESS(status)) { IoFreeIrp(irp); return status; } RtlZeroMemory(fileObject, sizeof(FILE_OBJECT)); fileObject->Type = IO_TYPE_FILE; fileObject->Size = sizeof(FILE_OBJECT); fileObject->DeviceObject = RealDevice; // fileObject->RelatedFileObject = NULL; fileObject->Flags = FO_SYNCHRONOUS_IO; fileObject->FileName.MaximumLength = FileName->MaximumLength; fileObject->FileName.Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, FileName->MaximumLength); if (fileObject->FileName.Buffer == NULL) { IoFreeIrp(irp); ObDereferenceObject(fileObject); return STATUS_INSUFFICIENT_RESOURCES; } RtlCopyUnicodeString(&fileObject->FileName, FileName); KeInitializeEvent(&fileObject->Lock, SynchronizationEvent, FALSE); KeInitializeEvent(&fileObject->Event, NotificationEvent, FALSE); irp->MdlAddress = NULL; irp->Flags |= IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API; irp->RequestorMode = KernelMode; irp->UserIosb = &ioStatus; irp->UserEvent = &event; irp->PendingReturned = FALSE; irp->Cancel = FALSE; irp->CancelRoutine = NULL; irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread(); irp->Tail.Overlay.AuxiliaryBuffer = NULL; irp->Tail.Overlay.OriginalFileObject = fileObject; status = SeCreateAccessState( &accessState, &auxData, DesiredAccess, IoGetFileObjectGenericMapping()); if (!NT_SUCCESS(status)) { IoFreeIrp(irp); ExFreePool(fileObject->FileName.Buffer); ObDereferenceObject(fileObject); return status; } securityContext.SecurityQos = NULL; securityContext.AccessState = &accessState; securityContext.DesiredAccess = DesiredAccess; securityContext.FullCreateOptions = 0; irpSp = IoGetNextIrpStackLocation(irp); irpSp->MajorFunction = IRP_MJ_CREATE; irpSp->DeviceObject = DeviceObject; irpSp->FileObject = fileObject; irpSp->Parameters.Create.SecurityContext = &securityContext; irpSp->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions; irpSp->Parameters.Create.FileAttributes = (USHORT)FileAttributes; irpSp->Parameters.Create.ShareAccess = (USHORT)ShareAccess; irpSp->Parameters.Create.EaLength = 0; IoSetCompletionRoutine(irp, IoCreateCompletionRoutine, NULL, TRUE, TRUE, TRUE); status = IoCallDriver(DeviceObject, irp); if (status == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL); } status = ioStatus.Status; //if (!NT_SUCCESS(status)) { ExFreePool(fileObject->FileName.Buffer); fileObject->FileName.Length = 0; fileObject->DeviceObject = NULL; ObDereferenceObject(fileObject); } //else //{ // InterlockedIncrement(&fileObject->DeviceObject->ReferenceCount); // if (fileObject->Vpb) // { // InterlockedIncrement(&fileObject->Vpb->ReferenceCount); // } // *Object = fileObject; // KdPrint(("Open file success! object = %x\n", fileObject)); //} return status; } |
|
|
沙发#
发布于:2008-04-10 11:16
请高手指点一下,在线等
|
|
|
板凳#
发布于:2008-04-10 11:34
RtlInitUnicodeString(&Filename, L"\\DosDevices\\D:\\user11\\");
|
|
地板#
发布于:2008-04-10 11:44
楼上的兄弟 还是不行啊
|
|
|
地下室#
发布于:2008-04-10 12:00
自己顶 !
|
|
|
5楼#
发布于:2008-04-10 14:13
我能创建文件,创建目录 没有试过。
|
|
6楼#
发布于:2008-04-10 14:21
我测试的创建文件也有问题,楼上的兄弟能不能把你的代码贴出来看看啊,谢谢了哈
|
|
|
7楼#
发布于:2008-04-10 14:41
对不起 我不是用的irp来创建的!我用的是影子设备来避免重入问题的!
|
|
8楼#
发布于:2008-04-10 14:48
我再试试 不行我也改用影子设备了
|
|
|
9楼#
发布于:2008-04-10 15:59
高手看看哈 顶起
|
|
|
10楼#
发布于:2008-07-03 22:13
楼主可以给个创建文件的例子吗?
我想学习一下,万分感谢! 邮箱:wise_bo@126.com |
|
|
驱动小牛
|
11楼#
发布于:2008-07-09 19:29
我也遇到过,但是忘了.安全属性肯定不能那么用.我现在已经不太相信这个例子了,仔细看下别人ZwCreateFile的源代码,别人处理了那么多东西.这个例子考虑的东西太少了.
|
|