// determine the directory for a given pathname // (wstring only for now; feel free to make this a template if needed) /*static*/ wstring File::DirectoryPathOf(wstring path) { #ifdef _WIN32 // Win32 accepts forward slashes, but it seems that PathRemoveFileSpec() does not // TODO: // "PathCchCanonicalize does the / to \ conversion as a part of the canonicalization, it's // probably a good idea to do that anyway since I suspect that the '..' characters might // confuse the other PathCch functions" [Larry Osterman] // "Consider GetFullPathName both for canonicalization and last element finding." [Jay Krell] path = msra::strfun::ReplaceAll<wstring>(path, L"/", L"\\"); HRESULT hr; if (IsWindows8OrGreater()) // PathCchRemoveFileSpec() only available on Windows 8+ { typedef HRESULT(*PathCchRemoveFileSpecProc)(_Inout_updates_(_Inexpressible_(cchPath)) PWSTR, _In_ size_t); HINSTANCE hinstLib = LoadLibrary(TEXT("api-ms-win-core-path-l1-1-0.dll")); if (hinstLib == nullptr) RuntimeError("DirectoryPathOf: LoadLibrary() unexpectedly failed."); PathCchRemoveFileSpecProc PathCchRemoveFileSpec = reinterpret_cast<PathCchRemoveFileSpecProc>(GetProcAddress(hinstLib, "PathCchRemoveFileSpec")); if (!PathCchRemoveFileSpec) RuntimeError("DirectoryPathOf: GetProcAddress() unexpectedly failed."); // this is the actual function call we care about hr = PathCchRemoveFileSpec(&path[0], path.size()); FreeLibrary(hinstLib); } else // on Windows 7-, use older PathRemoveFileSpec() instead hr = PathRemoveFileSpec(&path[0]) ? S_OK : S_FALSE; if (hr == S_OK) // done path.resize(wcslen(&path[0])); else if (hr == S_FALSE) // nothing to remove: use . path = L"."; else RuntimeError("DirectoryPathOf: Path(Cch)RemoveFileSpec() unexpectedly failed with 0x%08x.", (unsigned int)hr); #else auto pos = path.find_last_of(L"/"); if (pos != path.npos) path.erase(pos); else // if no directory path at all, use current directory return L"."; #endif return path; }
hr = SendControlTransferSynchronously( &(setupPacket.WinUsb), (PUCHAR) BarGraphState, sizeof(BAR_GRAPH_STATE), &bytesTransferred ); return hr; } HRESULT CMyDevice::SendControlTransferSynchronously( _In_ PWINUSB_SETUP_PACKET SetupPacket, _Inout_updates_(BufferLength) PBYTE Buffer, _In_ ULONG BufferLength, _Out_ PULONG LengthTransferred ) { HRESULT hr = S_OK; IWDFIoRequest *pWdfRequest = NULL; IWDFDriver * FxDriver = NULL; IWDFMemory * FxMemory = NULL; IWDFRequestCompletionParams * FxComplParams = NULL; IWDFUsbRequestCompletionParams * FxUsbComplParams = NULL; *LengthTransferred = 0; hr = m_FxDevice->CreateRequest( NULL, //pCallbackInterface NULL, //pParentObject
PVOID WeGetProcedureAddress( _In_ PSTR Name ) { static PVOID imageBase = NULL; if (!imageBase) imageBase = GetModuleHandle(L"ProcessHacker.exe"); return (PVOID)GetProcAddress(imageBase, Name); } VOID WeFormatLocalObjectName( _In_ PWSTR OriginalName, _Inout_updates_(256) PWCHAR Buffer, _Out_ PUNICODE_STRING ObjectName ) { SIZE_T length; SIZE_T originalNameLength; // Sessions other than session 0 require SeCreateGlobalPrivilege. if (NtCurrentPeb()->SessionId != 0) { memcpy(Buffer, L"\\Sessions\\", 10 * sizeof(WCHAR)); _ultow(NtCurrentPeb()->SessionId, Buffer + 10, 10); length = wcslen(Buffer); originalNameLength = wcslen(OriginalName); memcpy(Buffer + length, OriginalName, (originalNameLength + 1) * sizeof(WCHAR)); length += originalNameLength;
} } // Test2 if (registrationFoundCount != schemaFoundCount || NitsShouldFault(NitsHere(), NitsAutomatic)) { return GetCimMIError(MI_RESULT_INVALID_PARAMETER, extendedError, ID_MODMAN_VALIDATE_PROVREG_NOREG); } return r; } MI_Result ValidateSchema(_In_ MI_ClassA *miClassArray, _In_ MI_Uint32 classIndex, _Inout_updates_(resSize) MI_Boolean *bResourceVisited, _In_ MI_Uint32 resSize, _In_ MI_Boolean bConfigurationResource, _Outptr_result_maybenull_ MI_Instance **extendedError) { MI_Result r = MI_RESULT_OK; MI_Uint32 xCount = 0, yCount = 0; const MI_ClassDecl *classToCheck = NULL; MI_Uint32 keyPropertyCount = 0; MI_Uint32 propertyBitMask = 0; // 1 = Read, 2 = Write, 4 = Key, 8 = Required if( extendedError ) *extendedError = NULL; //PrintClass(miClassArray->data[classIndex]); if( classIndex >= miClassArray->size || NitsShouldFault(NitsHere(), NitsAutomatic))
LcmSplInSem(); while (pIniEntry && lstrcmpi(pName, pIniEntry->pName)) pIniEntry = pIniEntry->pNext; return pIniEntry; } LPBYTE LcmPackStrings( _In_ DWORD dwElementsCount, _In_reads_(dwElementsCount) LPCWSTR *pSource, _Out_writes_bytes_(pDest-pEnd) LPBYTE pDest, _In_reads_(dwElementsCount) DWORD *DestOffsets, _Inout_updates_(_Inexpressible_("Involves negative offsets.")) LPBYTE pEnd ) { DWORD dwCount = 0; for (dwCount = 0; dwCount < dwElementsCount; dwCount++) { if (*pSource) { #pragma prefast(suppress:__WARNING_POTENTIAL_BUFFER_OVERFLOW_NULLTERMINATED, "Just getting the length of current string, index of psource is correctly limited") size_t cbString = wcslen(*pSource)*sizeof(WCHAR) + sizeof(WCHAR); pEnd-= cbString; (VOID) StringCbCopy ((LPWSTR) pEnd, cbString, *pSource); *(LPWSTR UNALIGNED *)(pDest+*DestOffsets)= (LPWSTR) pEnd; }