mirror of
https://github.com/vxunderground/VX-API
synced 2026-06-06 16:54:55 +00:00
Create RfGetEnvironmentVariable.cpp
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
DWORD RfGetEnvironmentVariableW(LPCWSTR Name, LPWSTR Buffer, DWORD Size)
|
||||
{
|
||||
UNICODE_STRING uString; RtlZeroMemory(&uString, sizeof(UNICODE_STRING));
|
||||
UNICODE_STRING Variable; RtlZeroMemory(&Variable, sizeof(UNICODE_STRING));
|
||||
DWORD Token[1] = { 61 };
|
||||
LPWSTR String = NULL;
|
||||
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)GetPeb()->ProcessParameters;
|
||||
LPWSTR Environment = (LPWSTR)ProcessParameters->Environment;
|
||||
LPWSTR lpszPtr = (LPWSTR)Environment;
|
||||
PWCHAR Pointer;
|
||||
|
||||
BOOL bFlag = FALSE;
|
||||
|
||||
String = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR) * 2);
|
||||
if (String == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
DecimalToAsciiW(String, Token, 1);
|
||||
|
||||
Name = CaplockStringW((PWCHAR)Name);
|
||||
if (Name == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
RtlInitUnicodeString(&Variable, (PWCHAR)Name);
|
||||
|
||||
while (*lpszPtr)
|
||||
{
|
||||
DWORD dwVariableHash = 0;
|
||||
DWORD dwPointerHash = 0;
|
||||
lpszPtr += StringLengthW(lpszPtr) + 1;
|
||||
Pointer = StringTokenW(lpszPtr, String);
|
||||
if (Pointer == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
Pointer = CaplockStringW((PWCHAR)Pointer);
|
||||
|
||||
dwVariableHash = HashStringDjb2W(Variable.Buffer);
|
||||
dwPointerHash = HashStringDjb2W(lpszPtr);
|
||||
|
||||
if (dwVariableHash == dwPointerHash)
|
||||
{
|
||||
lpszPtr += StringLengthW(lpszPtr) + 1;
|
||||
Pointer = StringTokenW(lpszPtr, String);
|
||||
if (Pointer == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
RtlInitUnicodeString(&uString, Pointer);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (StringCopyW(Buffer, uString.Buffer) == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
bFlag = TRUE;
|
||||
|
||||
EXIT_ROUTINE:
|
||||
|
||||
if (String)
|
||||
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, String);
|
||||
|
||||
return (bFlag == TRUE ? uString.Length : 0);
|
||||
}
|
||||
|
||||
DWORD RfGetEnvironmentVariableA(LPCSTR Name, LPSTR Buffer, DWORD Size, BOOL UseAlt)
|
||||
{
|
||||
UNICODE_STRING uString; RtlZeroMemory(&uString, sizeof(UNICODE_STRING));
|
||||
UNICODE_STRING Variable; RtlZeroMemory(&Variable, sizeof(UNICODE_STRING));
|
||||
DWORD Token[1] = { 61 };
|
||||
LPWSTR String = NULL;
|
||||
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)GetPeb()->ProcessParameters;
|
||||
LPWSTR Environment = (LPWSTR)ProcessParameters->Environment;
|
||||
LPWSTR lpszPtr = (LPWSTR)Environment;
|
||||
PWCHAR Pointer;
|
||||
PWCHAR pwName = NULL;
|
||||
|
||||
BOOL bFlag = FALSE;
|
||||
|
||||
String = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR) * 2);
|
||||
if (String == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
pwName = (LPWSTR)RtlHeapAllocForward(256);
|
||||
if (pwName == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
if (CharStringToWCharString(pwName, (PCHAR)Name, 256) == 0)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
DecimalToAsciiW(String, Token, 1);
|
||||
|
||||
pwName = CaplockStringW((PWCHAR)pwName);
|
||||
if (Name == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
RtlInitUnicodeString(&Variable, (PWCHAR)pwName);
|
||||
|
||||
while (*lpszPtr)
|
||||
{
|
||||
DWORD dwVariableHash = 0;
|
||||
DWORD dwPointerHash = 0;
|
||||
lpszPtr += StringLengthW(lpszPtr) + 1;
|
||||
Pointer = StringTokenW(lpszPtr, String);
|
||||
if (Pointer == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
Pointer = CaplockStringW((PWCHAR)Pointer);
|
||||
|
||||
dwVariableHash = HashStringDjb2W(Variable.Buffer);
|
||||
dwPointerHash = HashStringDjb2W(lpszPtr);
|
||||
|
||||
if (dwVariableHash == dwPointerHash)
|
||||
{
|
||||
lpszPtr += StringLengthW(lpszPtr) + 1;
|
||||
Pointer = StringTokenW(lpszPtr, String);
|
||||
if (Pointer == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
RtlInitUnicodeString(&uString, Pointer);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (WCharStringToCharString(Buffer, uString.Buffer, uString.MaximumLength) == 0)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
bFlag = TRUE;
|
||||
|
||||
EXIT_ROUTINE:
|
||||
|
||||
if (pwName)
|
||||
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, pwName);
|
||||
|
||||
if (String)
|
||||
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, String);
|
||||
|
||||
return (bFlag == TRUE ? uString.Length : 0);
|
||||
}
|
||||
Reference in New Issue
Block a user