BOOLEAN NTAPI DotNetVersionsEnumModulesCallback( __in PPH_MODULE_INFO Module, __in_opt PVOID Context ) { if ( PhEqualString2(Module->Name, L"clr.dll", TRUE) || PhEqualString2(Module->Name, L"mscorwks.dll", TRUE) || PhEqualString2(Module->Name, L"mscorsvr.dll", TRUE) ) { static PH_STRINGREF frameworkString = PH_STRINGREF_INIT(L"Microsoft.NET\\Framework\\"); static PH_STRINGREF framework64String = PH_STRINGREF_INIT(L"Microsoft.NET\\Framework64\\"); PPH_STRINGREF splitAt; PH_STRINGREF firstPart; PH_STRINGREF secondPart; #ifdef _M_X64 if (*(PULONG)Context & CLR_PROCESS_IS_WOW64) { #endif splitAt = &frameworkString; #ifdef _M_X64 } else { splitAt = &framework64String; } #endif if (PhSplitStringRefAtString(&Module->FileName->sr, splitAt, TRUE, &firstPart, &secondPart)) { if (secondPart.Length >= 4 * sizeof(WCHAR)) // vx.x { if (secondPart.Buffer[1] == '1') { if (secondPart.Buffer[3] == '0') *(PULONG)Context |= CLR_VERSION_1_0; else if (secondPart.Buffer[3] == '1') *(PULONG)Context |= CLR_VERSION_1_1; } else if (secondPart.Buffer[1] == '2') { *(PULONG)Context |= CLR_VERSION_2_0; } else if (secondPart.Buffer[1] >= '4' && secondPart.Buffer[1] <= '9') { *(PULONG)Context |= CLR_VERSION_4_ABOVE; } } } } return TRUE; }
PPH_STRING PhpGetX500Value( _In_ PPH_STRINGREF String, _In_ PPH_STRINGREF KeyName ) { WCHAR keyNamePlusEqualsBuffer[10]; PH_STRINGREF keyNamePlusEquals; SIZE_T keyNameLength; PH_STRINGREF firstPart; PH_STRINGREF remainingPart; keyNameLength = KeyName->Length / sizeof(WCHAR); assert(!(keyNameLength > sizeof(keyNamePlusEquals) / sizeof(WCHAR) - 1)); keyNamePlusEquals.Buffer = keyNamePlusEqualsBuffer; keyNamePlusEquals.Length = (keyNameLength + 1) * sizeof(WCHAR); memcpy(keyNamePlusEquals.Buffer, KeyName->Buffer, KeyName->Length); keyNamePlusEquals.Buffer[keyNameLength] = '='; // Find "Key=". if (!PhSplitStringRefAtString(String, &keyNamePlusEquals, FALSE, &firstPart, &remainingPart)) return NULL; if (remainingPart.Length == 0) return NULL; // Is the value quoted? If so, return the part inside the quotes. if (remainingPart.Buffer[0] == '"') { PhSkipStringRef(&remainingPart, sizeof(WCHAR)); if (!PhSplitStringRefAtChar(&remainingPart, '"', &firstPart, &remainingPart)) return NULL; return PhCreateString2(&firstPart); } else { PhSplitStringRefAtChar(&remainingPart, ',', &firstPart, &remainingPart); return PhCreateString2(&firstPart); } }
VOID PhShellExecuteUserString( __in HWND hWnd, __in PWSTR Setting, __in PWSTR String, __in BOOLEAN UseShellExecute, __in_opt PWSTR ErrorMessage ) { static PH_STRINGREF replacementToken = PH_STRINGREF_INIT(L"%s"); PPH_STRING executeString; PH_STRINGREF stringBefore; PH_STRINGREF stringMiddle; PH_STRINGREF stringAfter; PPH_STRING newString; PPH_STRING ntMessage; executeString = PhGetStringSetting(Setting); // Make sure the user executable string is absolute. // We can't use RtlDetermineDosPathNameType_U here because the string // may be a URL. if (PhFindCharInString(executeString, 0, ':') == -1) { newString = PhConcatStringRef2(&PhApplicationDirectory->sr, &executeString->sr); PhDereferenceObject(executeString); executeString = newString; } // Replace "%s" with the string, or use the original string if "%s" is not present. if (PhSplitStringRefAtString(&executeString->sr, &replacementToken, FALSE, &stringBefore, &stringAfter)) { PhInitializeStringRef(&stringMiddle, String); newString = PhConcatStringRef3(&stringBefore, &stringMiddle, &stringAfter); } else { newString = executeString; PhReferenceObject(newString); } PhDereferenceObject(executeString); if (UseShellExecute) { PhShellExecute(hWnd, newString->Buffer, NULL); } else { NTSTATUS status; status = PhCreateProcessWin32(NULL, newString->Buffer, NULL, NULL, 0, NULL, NULL, NULL); if (!NT_SUCCESS(status)) { if (ErrorMessage) { ntMessage = PhGetNtMessage(status); PhShowError(hWnd, L"Unable to execute the command: %s\n%s", PhGetStringOrDefault(ntMessage, L"An unknown error occurred."), ErrorMessage); PhDereferenceObject(ntMessage); } else { PhShowStatus(hWnd, L"Unable to execute the command", status, 0); } } } PhDereferenceObject(newString); }