NTSTATUS IopIrpCreate( OUT PIRP* ppIrp, IN IRP_TYPE Type, IN PIO_FILE_OBJECT pFileObject ) { NTSTATUS status = 0; int EE = 0; PIRP pIrp = NULL; status = IopIrpCreateDetached(&pIrp); GOTO_CLEANUP_ON_STATUS_EE(status, EE); status = IopIrpAttach(pIrp, Type, pFileObject); GOTO_CLEANUP_ON_STATUS_EE(status, EE); cleanup: if (status) { IopIrpDereference(&pIrp); } *ppIrp = pIrp; IO_LOG_LEAVE_ON_STATUS_EE(status, EE); return status; }
NTSTATUS IopFileObjectAllocate( OUT PIO_FILE_OBJECT* ppFileObject, IN PIO_DEVICE_OBJECT pDevice, IN PIO_FILE_NAME FileName ) { NTSTATUS status = 0; int EE = 0; PIO_FILE_OBJECT pFileObject = NULL; status = IO_ALLOCATE(&pFileObject, IO_FILE_OBJECT, sizeof(*pFileObject)); GOTO_CLEANUP_ON_STATUS_EE(status, EE); pFileObject->ReferenceCount = 1; pFileObject->pDevice = pDevice; IopDeviceReference(pDevice); LwListInit(&pFileObject->IrpList); LwListInit(&pFileObject->DeviceLinks); LwListInit(&pFileObject->RundownLinks); LwListInit(&pFileObject->ZctCompletionIrpList); // Pre-allocate IRP for close. status = IopIrpCreateDetached(&pFileObject->pCloseIrp); GOTO_CLEANUP_ON_STATUS_EE(status, EE); if (FileName->RootFileHandle) { SetFlag(pFileObject->Flags, FILE_OBJECT_FLAG_RELATIVE); } status = LwRtlUnicodeStringDuplicate( &pFileObject->FileName, &FileName->Name); GOTO_CLEANUP_ON_STATUS_EE(status, EE); status = LwRtlInitializeMutex(&pFileObject->Mutex, TRUE); GOTO_CLEANUP_ON_STATUS_EE(status, EE); status = LwRtlInitializeConditionVariable(&pFileObject->Rundown.Condition); GOTO_CLEANUP_ON_STATUS_EE(status, EE); IopDeviceLock(pDevice); if (IsSetFlag(pDevice->Flags, IO_DEVICE_OBJECT_FLAG_RUNDOWN) || IsSetFlag(pDevice->Flags, IO_DEVICE_OBJECT_FLAG_RUNDOWN_DRIVER)) { // TODO: Find "correct" error code. status = STATUS_INVALID_HANDLE; } else { LwListInsertTail(&pDevice->FileObjectsList, &pFileObject->DeviceLinks); } IopDeviceUnlock(pDevice); cleanup: if (status) { IopFileObjectDereference(&pFileObject); } *ppFileObject = pFileObject; IO_LOG_LEAVE_ON_STATUS_EE(status, EE); return status; }