VOID IopFileObjectFree( IN OUT PIO_FILE_OBJECT* ppFileObject ) { PIO_FILE_OBJECT pFileObject = *ppFileObject; if (pFileObject) { LWIO_ASSERT(LwListIsEmpty(&pFileObject->IrpList)); IopIrpFreeZctIrpList(pFileObject); IopDeviceLock(pFileObject->pDevice); LwListRemove(&pFileObject->DeviceLinks); IopDeviceUnlock(pFileObject->pDevice); IopDeviceDereference(&pFileObject->pDevice); LwRtlCleanupConditionVariable(&pFileObject->Rundown.Condition); LwRtlCleanupMutex(&pFileObject->Mutex); LwRtlUnicodeStringFree(&pFileObject->FileName); IopIrpDereference(&pFileObject->pCloseIrp); IoMemoryFree(pFileObject); *ppFileObject = NULL; } }
LW_NTSTATUS LwRtlWC16StringAllocateFromUnicodeString( LW_OUT LW_PWSTR* ppszNewString, LW_IN LW_PUNICODE_STRING pOriginalString ) { NTSTATUS status = 0; UNICODE_STRING terminatedOriginalString = { 0 }; PWSTR pszNewString = NULL; // Since duplicate always does NULL-termination, we can // safely use the Buffer field as a WC16String. status = LwRtlUnicodeStringDuplicate(&terminatedOriginalString, pOriginalString); GOTO_CLEANUP_ON_STATUS(status); pszNewString = terminatedOriginalString.Buffer; terminatedOriginalString.Buffer = NULL; terminatedOriginalString.Length = 0; terminatedOriginalString.MaximumLength = 0; cleanup: if (!NT_SUCCESS(status)) { RTL_FREE(&pszNewString); } LwRtlUnicodeStringFree(&terminatedOriginalString); *ppszNewString = pszNewString; return status; }
NTSTATUS NpfsFreeFCB( PNPFS_FCB pFCB ) { NTSTATUS ntStatus = 0; pthread_rwlock_destroy(&pFCB->PipeListRWLock); LwRtlUnicodeStringFree(&pFCB->PipeName); NpfsFreeMemory(pFCB); return(ntStatus); }
static NTSTATUS LwIoNormalizePath( IN PUNICODE_STRING Path, OUT PUNICODE_STRING NormalPath ) { NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING normalPath = { 0 }; ULONG inputIndex = 0; ULONG outputIndex = 0; ULONG count = 0; status = LwRtlUnicodeStringDuplicate(&normalPath, Path); GOTO_CLEANUP_ON_STATUS(status); count = LW_RTL_STRING_NUM_CHARS(&normalPath); for (inputIndex = outputIndex = 0; inputIndex < count; inputIndex++) { switch (normalPath.Buffer[inputIndex]) { case '\\': case '/': normalPath.Buffer[outputIndex++] = '/'; while (((inputIndex + 1) < count) && IoRtlPathIsSeparator(normalPath.Buffer[inputIndex+1])) { inputIndex++; } break; default: normalPath.Buffer[outputIndex++] = normalPath.Buffer[inputIndex]; break; } } normalPath.Length = LwRtlPointerToOffset(normalPath.Buffer, &normalPath.Buffer[outputIndex]); normalPath.MaximumLength = normalPath.Length; cleanup: if (status) { LwRtlUnicodeStringFree(&normalPath); } *NormalPath = normalPath; return status; }
static VOID IopIrpFree( IN OUT PIRP* ppIrp ) { PIRP pIrp = *ppIrp; if (pIrp) { PIRP_INTERNAL irpInternal = IopIrpGetInternal(pIrp); LWIO_ASSERT(0 == irpInternal->ReferenceCount); LWIO_ASSERT(STATUS_PENDING != pIrp->IoStatusBlock.Status); switch (pIrp->Type) { case IRP_TYPE_CREATE: case IRP_TYPE_CREATE_NAMED_PIPE: IoSecurityDereferenceSecurityContext(&pIrp->Args.Create.SecurityContext); RtlUnicodeStringFree(&pIrp->Args.Create.FileName.Name); break; case IRP_TYPE_QUERY_DIRECTORY: if (pIrp->Args.QueryDirectory.FileSpec) { LwRtlUnicodeStringFree(&pIrp->Args.QueryDirectory.FileSpec->Pattern); IO_FREE(&pIrp->Args.QueryDirectory.FileSpec); } break; default: break; } // Note that the parent (FO) lock is already held // by IopIrpDereference(). // Might not be in the list if IRP creation failed. if (irpInternal->FileObjectLinks.Next) { LwListRemove(&irpInternal->FileObjectLinks); } IopFileObjectDereference(&pIrp->FileHandle); IoMemoryFree(pIrp); *ppIrp = NULL; } }
static VOID LwIoDeletePathCreds( PIO_PATH_CREDS pPathCreds ) { if (pPathCreds) { LwRtlUnicodeStringFree(&pPathCreds->PathPrefix); if (pPathCreds->pCreds) { LwIoDeleteCreds(pPathCreds->pCreds); } RTL_FREE(&pPathCreds); } }
static NTSTATUS LwIoFindPathCreds( IN PUNICODE_STRING Path, IN BOOLEAN bPrecise, OUT PIO_PATH_CREDS* ppCreds ) { NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING normalPath = { 0 }; PIO_PATH_CREDS pFoundCreds = NULL; PLW_LIST_LINKS pLink = NULL; status = LwIoNormalizePath(Path, &normalPath); GOTO_CLEANUP_ON_STATUS(status); while ((pLink = LwListTraverse(&gPathCreds, pLink))) { PIO_PATH_CREDS pCreds = LW_STRUCT_FROM_FIELD(pLink, IO_PATH_CREDS, link); if ((bPrecise && LwRtlUnicodeStringIsEqual(&normalPath, &pCreds->PathPrefix, TRUE)) || (!bPrecise && LwRtlUnicodeStringIsPrefix(&pCreds->PathPrefix, &normalPath, TRUE))) { pFoundCreds = pCreds; break; } } cleanup: if (status) { pFoundCreds = NULL; } LwRtlUnicodeStringFree(&normalPath); *ppCreds = pFoundCreds; return status; }