static NTSTATUS LwRtlWC16StringAllocateAppendPrintfV( IN OUT PWSTR* ppszString, IN PCSTR pszFormat, IN va_list Args ) { NTSTATUS status = 0; PWSTR pszAddString = NULL; PWSTR pszNewString = NULL; status = LwRtlWC16StringAllocatePrintfV(&pszAddString, pszFormat, Args); GOTO_CLEANUP_ON_STATUS(status); if (*ppszString) { status = LwRtlWC16StringAllocatePrintf(&pszNewString, "%ws%ws", *ppszString, pszAddString); GOTO_CLEANUP_ON_STATUS(status); } else { pszNewString = pszAddString; pszAddString = NULL; } cleanup: if (status) { LwRtlWC16StringFree(&pszNewString); } else { LwRtlWC16StringFree(ppszString); *ppszString = pszNewString; } LwRtlWC16StringFree(&pszAddString); return status; }
static NTSTATUS PvfsNotifyReportIrp( PPVFS_IRP_CONTEXT pIrpContext, FILE_ACTION Action, PCSTR pszFilename ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PVOID pBuffer = pIrpContext->pIrp->Args.ReadDirectoryChange.Buffer; ULONG Length = pIrpContext->pIrp->Args.ReadDirectoryChange.Length; PFILE_NOTIFY_INFORMATION pNotifyInfo = NULL; LONG FilenameBytes = 0; PWSTR pwszFilename = NULL; ULONG BytesNeeded = 0; ntError = LwRtlWC16StringAllocateFromCString(&pwszFilename, pszFilename); BAIL_ON_NT_STATUS(ntError); FilenameBytes = (LwRtlWC16StringNumChars(pwszFilename) + 1) * sizeof(WCHAR); BytesNeeded = sizeof(*pNotifyInfo) + FilenameBytes; if (Length < BytesNeeded) { memset(pBuffer, 0x0, Length); ntError = STATUS_NOTIFY_ENUM_DIR; BAIL_ON_NT_STATUS(ntError); } pNotifyInfo = (PFILE_NOTIFY_INFORMATION)pBuffer; pNotifyInfo->NextEntryOffset = 0; pNotifyInfo->Action = Action; pNotifyInfo->FileNameLength = FilenameBytes; memcpy(&pNotifyInfo->FileName, pwszFilename, FilenameBytes); pIrpContext->pIrp->IoStatusBlock.BytesTransferred = BytesNeeded; cleanup: pIrpContext->pIrp->IoStatusBlock.Status = ntError; PvfsCompleteIrpContext(pIrpContext); LwRtlWC16StringFree(&pwszFilename); return ntError; error: goto cleanup; }
NTSTATUS PvfsFreeCCB( PPVFS_CCB pCCB ) { LWIO_ASSERT(pCCB->RefCount == 0); if (pCCB->pScb) { PvfsRemoveCCBFromSCB(pCCB->pScb, pCCB); PvfsReleaseSCB(&pCCB->pScb); } if (pCCB->pDirContext) { PvfsFreeDirectoryContext(pCCB->pDirContext); } if (pCCB->pUserToken) { RtlReleaseAccessToken(&pCCB->pUserToken); pCCB->pUserToken = NULL; } PvfsListDestroy(&pCCB->pZctContextList); LwRtlWC16StringFree(&pCCB->pwszShareName); PVFS_FREE(&pCCB->LockTable.ExclusiveLocks.pLocks); PVFS_FREE(&pCCB->LockTable.SharedLocks.pLocks); pthread_mutex_destroy(&pCCB->ControlBlock); PVFS_FREE(&pCCB); InterlockedDecrement(&gPvfsDriverState.Counters.Ccb); return STATUS_SUCCESS; }
static NTSTATUS PvfsNotifyReportBuffer( PPVFS_NOTIFY_FILTER_BUFFER pFilterBuffer, FILE_ACTION Action, PCSTR pszFilename ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PVOID pBuffer = pFilterBuffer->pData + pFilterBuffer->Offset; ULONG Length = pFilterBuffer->Length - pFilterBuffer->Offset; PFILE_NOTIFY_INFORMATION pNotifyInfo = NULL; LONG FilenameBytes = 0; PWSTR pwszFilename = NULL; ULONG BytesNeeded = 0; /* Don't bother if we have already overflowed the buffer */ BAIL_ON_NT_STATUS(pFilterBuffer->Status); ntError = LwRtlWC16StringAllocateFromCString(&pwszFilename, pszFilename); BAIL_ON_NT_STATUS(ntError); FilenameBytes = (LwRtlWC16StringNumChars(pwszFilename) + 1) * sizeof(WCHAR); BytesNeeded = sizeof(*pNotifyInfo) + FilenameBytes; PVFS_ALIGN_MEMORY(BytesNeeded, 8); if (Length < BytesNeeded) { ntError = pFilterBuffer->Status = STATUS_NOTIFY_ENUM_DIR; BAIL_ON_NT_STATUS(ntError); } pNotifyInfo = (PFILE_NOTIFY_INFORMATION)pBuffer; pNotifyInfo->NextEntryOffset = 0; pNotifyInfo->Action = Action; pNotifyInfo->FileNameLength = FilenameBytes; memcpy(&pNotifyInfo->FileName, pwszFilename, FilenameBytes); if (pFilterBuffer->pNotify) { ULONG NextEntry = PVFS_PTR_DIFF(pFilterBuffer->pNotify, pNotifyInfo); pFilterBuffer->pNotify->NextEntryOffset = NextEntry; } pFilterBuffer->pNotify = pNotifyInfo; pFilterBuffer->Offset += BytesNeeded; cleanup: LwRtlWC16StringFree(&pwszFilename); return ntError; error: goto cleanup; }
NTSTATUS DfsConfigReadStandaloneRoots( VOID ) { NTSTATUS ntStatus = STATUS_SUCCESS; HANDLE hRegConnection = (HANDLE)NULL; HKEY hStandaloneKey = (HKEY)NULL; PWSTR pwszStandaloneRootKeyPath = NULL; DWORD dwIndex = 0; DWORD dwReserved = 0; DWORD dwDfsRootNameSize = MAX_KEY_LENGTH; WCHAR pwszDfsRootName[MAX_KEY_LENGTH] = {0}; BOOLEAN bFinished = FALSE; ntStatus = LwRtlWC16StringAllocateFromCString( &pwszStandaloneRootKeyPath, DFS_CONF_ROOT_STANDALONE); BAIL_ON_NT_STATUS(ntStatus); ntStatus = NtRegOpenServer(&hRegConnection); BAIL_ON_NT_STATUS(ntStatus); ntStatus = NtRegOpenKeyExW( hRegConnection, NULL, pwszStandaloneRootKeyPath, 0, KEY_READ, &hStandaloneKey); BAIL_ON_NT_STATUS(ntStatus); for (dwIndex = 0; !bFinished; dwIndex++) { ntStatus = NtRegEnumKeyExW( hRegConnection, hStandaloneKey, dwIndex, pwszDfsRootName, &dwDfsRootNameSize, &dwReserved, NULL, NULL, NULL); if (ntStatus == STATUS_NO_MORE_ENTRIES) { ntStatus = STATUS_SUCCESS; bFinished = TRUE; continue; } BAIL_ON_NT_STATUS(ntStatus); ntStatus = DfsConfigInitializeRoot( hRegConnection, hStandaloneKey, pwszDfsRootName); BAIL_ON_NT_STATUS(ntStatus); } cleanup: if (pwszStandaloneRootKeyPath) { LwRtlWC16StringFree(&pwszStandaloneRootKeyPath); } if (hStandaloneKey) { NtRegCloseKey(hRegConnection, hStandaloneKey); } if (hRegConnection) { NtRegCloseServer(hRegConnection); } return ntStatus; error: goto cleanup; }
void UmnEvtFreeEventComputerName() { LwRtlWC16StringFree(&gEventComputerName); }