You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
663 lines
27 KiB
663 lines
27 KiB
|
|
#include<nt.h>
|
|
#include<ntrtl.h>
|
|
#include<nturtl.h>
|
|
#include<stdio.h>
|
|
#include<string.h>
|
|
#include<memory.h>
|
|
#include<malloc.h>
|
|
#include<stdlib.h>
|
|
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
#include <dbghelp.h>
|
|
#include <ntsdexts.h>
|
|
#include <wdbgexts.h>
|
|
#include <ntverp.h>
|
|
|
|
#define private public
|
|
#define protected public
|
|
|
|
#include "uenv.h"
|
|
#include "reghash.h"
|
|
|
|
//
|
|
// forwards
|
|
//
|
|
|
|
BOOL
|
|
ReadMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead );
|
|
|
|
BOOL
|
|
ReadMemoryKernelMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead );
|
|
|
|
BOOL
|
|
WriteMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead );
|
|
|
|
BOOL
|
|
WriteMemoryKernelMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead );
|
|
|
|
//
|
|
// types
|
|
//
|
|
|
|
typedef BOOL (*UEnvReadMemory)( HANDLE, const void*, void*, DWORD, DWORD* );
|
|
typedef BOOL (*UEnvWriteMemory)( HANDLE, void*, void*, DWORD, DWORD* );
|
|
|
|
//
|
|
// globals
|
|
//
|
|
EXT_API_VERSION ApiVersion = { (VER_PRODUCTVERSION_W >> 8), (VER_PRODUCTVERSION_W & 0xff), EXT_API_VERSION_NUMBER, 0 };
|
|
WINDBG_EXTENSION_APIS ExtensionApis;
|
|
USHORT SavedMajorVersion = 0;
|
|
USHORT SavedMinorVersion = 0;
|
|
BOOL fKernelDebug = FALSE;
|
|
UEnvReadMemory ReadMemoryExt = ReadMemoryUserMode;
|
|
UEnvReadMemory WriteMemoryExt = ReadMemoryUserMode;
|
|
|
|
//
|
|
// macros
|
|
//
|
|
#define ExtensionRoutinePrologue() if (!fKernelDebug) \
|
|
{ \
|
|
ExtensionApis = *lpExtensionApis; \
|
|
ReadMemoryExt = ReadMemoryUserMode; \
|
|
WriteMemoryExt = WriteMemoryUserMode; \
|
|
} \
|
|
ULONG_PTR dwAddr = GetExpression(lpArgumentString); \
|
|
|
|
#define PRINT_SIZE(_x_) {dprintf(#_x_" - 0x%X\n", sizeof(_x_));}
|
|
|
|
#define Boolean( x ) ( x ) ? "True" : "False"
|
|
|
|
//
|
|
// routines
|
|
//
|
|
|
|
BOOL
|
|
DllInit(HANDLE hModule,
|
|
DWORD dwReason,
|
|
DWORD dwReserved )
|
|
{
|
|
switch (dwReason) {
|
|
case DLL_THREAD_ATTACH:
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_ATTACH:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
WinDbgExtensionDllInit(
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
USHORT MajorVersion,
|
|
USHORT MinorVersion
|
|
)
|
|
{
|
|
fKernelDebug = TRUE;
|
|
ReadMemoryExt = ReadMemoryKernelMode;
|
|
WriteMemoryExt = WriteMemoryKernelMode;
|
|
|
|
ExtensionApis = *lpExtensionApis;
|
|
|
|
SavedMajorVersion = MajorVersion;
|
|
SavedMinorVersion = MinorVersion;
|
|
|
|
return;
|
|
}
|
|
|
|
//
|
|
// define our own operators new and delete, so that we do not have to include the crt
|
|
//
|
|
void* __cdecl
|
|
::operator new(size_t dwBytes)
|
|
{
|
|
void *p;
|
|
p = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytes);
|
|
return (p);
|
|
}
|
|
|
|
|
|
void __cdecl
|
|
::operator delete (void* p)
|
|
{
|
|
HeapFree(GetProcessHeap(), 0, p);
|
|
}
|
|
|
|
BOOL
|
|
ReadMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead )
|
|
{
|
|
return ReadProcessMemory( hProcess, pAddress, pBuffer, dwSize, pdwRead );
|
|
}
|
|
|
|
BOOL
|
|
ReadMemoryKernelMode( HANDLE, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead )
|
|
{
|
|
return ReadMemory( (ULONG) pAddress, pBuffer, dwSize, pdwRead );
|
|
}
|
|
|
|
BOOL
|
|
WriteMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead )
|
|
{
|
|
return WriteProcessMemory( hProcess, (void*) pAddress, pBuffer, dwSize, pdwRead );
|
|
}
|
|
|
|
BOOL
|
|
WriteMemoryKernelMode( HANDLE, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead )
|
|
{
|
|
return WriteMemory( (ULONG) pAddress, pBuffer, dwSize, pdwRead );
|
|
}
|
|
|
|
void
|
|
PrintUuid( UUID x )
|
|
{
|
|
dprintf("%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
x.Data1, x.Data2, x.Data3, x.Data4[0], x.Data4[1],
|
|
x.Data4[2], x.Data4[3], x.Data4[4], x.Data4[5],
|
|
x.Data4[6], x.Data4[7] );
|
|
}
|
|
|
|
void
|
|
version(HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
|
|
#if DBG
|
|
PCHAR DebuggerType = "Checked";
|
|
#else
|
|
PCHAR DebuggerType = "Free";
|
|
#endif
|
|
|
|
if ( fKernelDebug )
|
|
{
|
|
dprintf( "%s UserEnv Extension dll for Build %d debugging %s kernel for Build %d\n",
|
|
DebuggerType,
|
|
VER_PRODUCTBUILD,
|
|
SavedMajorVersion == 0x0c ? "Checked" : "Free",
|
|
SavedMinorVersion
|
|
);
|
|
}
|
|
else
|
|
{
|
|
dprintf(
|
|
"%s UserEnv Extension dll for Build %d\n",
|
|
DebuggerType,
|
|
VER_PRODUCTBUILD
|
|
);
|
|
}
|
|
}
|
|
|
|
LPEXT_API_VERSION
|
|
ExtensionApiVersion( void )
|
|
{
|
|
return &ApiVersion;
|
|
}
|
|
|
|
void help( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
dprintf("!version\n");
|
|
dprintf("!gpo <address>\n");
|
|
dprintf("!gpext <address>\n");
|
|
dprintf("!container <address>\n");
|
|
dprintf("!som <address>\n");
|
|
dprintf("!profile <address>\n");
|
|
dprintf("!debuglevel <address>\n");
|
|
dprintf("!dmpregtable <address>\n");
|
|
|
|
// dprintf("!globals\n");
|
|
dprintf("!sizes\n");
|
|
}
|
|
|
|
void gpo( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(GPOINFO)];
|
|
LPGPOINFO lpGPOInfo = (LPGPOINFO) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(GPOINFO), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(GPOINFO) )
|
|
{
|
|
dprintf("dwFlags - 0x%08X\n", lpGPOInfo->dwFlags );
|
|
dprintf("iMachineRole - %d\n", lpGPOInfo->iMachineRole );
|
|
dprintf("hToken - 0x%08X\n", lpGPOInfo->hToken );
|
|
dprintf("pRsopToken - 0x%08X\n", lpGPOInfo->pRsopToken );
|
|
|
|
WCHAR sz[128];
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPOInfo->lpDNName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
|
|
dprintf("lpDNName - 0x%08X\t: \"%S\"\n", lpGPOInfo->lpDNName, bOk ? sz : L"" );
|
|
dprintf("hEvent - 0x%08X\n", lpGPOInfo->hEvent );
|
|
dprintf("hKeyRoot - 0x%08X\n", lpGPOInfo->hKeyRoot );
|
|
dprintf("bXferToExtList - %s\n", Boolean( lpGPOInfo->bXferToExtList ) );
|
|
dprintf("lpExtFilterList - 0x%08X\n", lpGPOInfo->lpExtFilterList );
|
|
dprintf("lpGPOList - 0x%08X\n", lpGPOInfo->lpGPOList );
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPOInfo->lpwszSidUser, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
|
|
dprintf("lpwszSidUser - 0x%08X\t: \"%S\"\n", lpGPOInfo->lpwszSidUser, bOk ? sz : L"" );
|
|
dprintf("hTriggerEvent - 0x%08X\n", lpGPOInfo->hTriggerEvent );
|
|
dprintf("hNotifyEvent - 0x%08X\n", lpGPOInfo->hNotifyEvent );
|
|
dprintf("hCritSection - 0x%08X\n", lpGPOInfo->hCritSection );
|
|
dprintf("lpExtensions - 0x%08X\n", lpGPOInfo->lpExtensions );
|
|
dprintf("bMemChanged - %s\n", Boolean( lpGPOInfo->bMemChanged ) );
|
|
dprintf("bUserLocalMemChanged - %s\n", Boolean( lpGPOInfo->bUserLocalMemChanged ) );
|
|
dprintf("pStatusCallback - 0x%08X\n", lpGPOInfo->pStatusCallback );
|
|
dprintf("lpSOMList - 0x%08X\n", lpGPOInfo->lpSOMList );
|
|
dprintf("lpGpContainerList - 0x%08X\n", lpGPOInfo->lpGpContainerList );
|
|
dprintf("lpLoopbackSOMList - 0x%08X\n", lpGPOInfo->lpLoopbackSOMList );
|
|
dprintf("lpLoopbackGpContainer - 0x%08X\n", lpGPOInfo->lpLoopbackGpContainerList );
|
|
}
|
|
}
|
|
|
|
void gpext( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(GPEXT)];
|
|
LPGPEXT lpGPExt = (LPGPEXT) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(GPEXT), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(GPEXT) )
|
|
{
|
|
WCHAR sz[256];
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPExt->lpDisplayName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpDisplayName - 0x%08X\t: \"%S\"\n", lpGPExt->lpDisplayName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPExt->lpKeyName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpKeyName - 0x%08X\t: \"%S\"\n", lpGPExt->lpKeyName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPExt->lpDllName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpDllName - 0x%08X\t: \"%S\"\n", lpGPExt->lpDllName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPExt->lpFunctionName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpFunctionName - 0x%08X\t: \"%S\"\n", lpGPExt->lpFunctionName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPExt->lpRsopFunctionName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpRsopFunctionName - 0x%08X\t: \"%S\"\n", lpGPExt->lpRsopFunctionName, bOk ? sz : L"" );
|
|
|
|
dprintf("hInstance - 0x%08X\n", lpGPExt->hInstance );
|
|
|
|
DWORD dwDisplacement = 0;
|
|
GetSymbol((void*)lpGPExt->pEntryPoint, (UCHAR *)sz, &dwDisplacement);
|
|
sz[64] = 0;
|
|
dprintf("pEntryPoint - 0x%08X\t: %s\n", lpGPExt->pEntryPoint, sz );
|
|
GetSymbol((void*)lpGPExt->pRsopEntryPoint, (UCHAR *)sz, &dwDisplacement);
|
|
sz[64] = 0;
|
|
dprintf("pRsopEntryPoint - 0x%08X\t: %s\n", lpGPExt->pRsopEntryPoint, sz );
|
|
|
|
dprintf("dwNoMachPolicy - 0x%08X\n", lpGPExt->dwNoMachPolicy );
|
|
dprintf("dwNoUserPolicy - 0x%08X\n", lpGPExt->dwNoUserPolicy );
|
|
dprintf("dwNoSlowLink - 0x%08X\n", lpGPExt->dwNoSlowLink );
|
|
dprintf("dwNoBackgroundPolicy - 0x%08X\n", lpGPExt->dwNoBackgroundPolicy );
|
|
dprintf("dwNoGPOChanges - 0x%08X\n", lpGPExt->dwNoGPOChanges );
|
|
dprintf("dwUserLocalSetting - 0x%08X\n", lpGPExt->dwUserLocalSetting );
|
|
dprintf("dwRequireRegistry - 0x%08X\n", lpGPExt->dwRequireRegistry );
|
|
dprintf("dwEnableAsynch - 0x%08X\n", lpGPExt->dwEnableAsynch );
|
|
dprintf("dwLinkTransition - 0x%08X\n", lpGPExt->dwLinkTransition );
|
|
dprintf("dwMaxChangesInterval - 0x%08X\n", lpGPExt->dwMaxChangesInterval );
|
|
|
|
dprintf("bRegistryExt - %s\n", Boolean( lpGPExt->bRegistryExt ) );
|
|
dprintf("bSkipped - %s\n", Boolean( lpGPExt->bSkipped ) );
|
|
dprintf("bHistoryProcessing - %s\n", Boolean( lpGPExt->bHistoryProcessing ) );
|
|
|
|
// dprintf("dwSlowLinkPrev - 0x%08X\n", lpGPExt->dwSlowLinkPrev );
|
|
|
|
dprintf("guid - " );
|
|
PrintUuid( lpGPExt->guid );
|
|
dprintf("\n" );
|
|
|
|
dprintf("pNext - 0x%08X\n", lpGPExt->pNext );
|
|
}
|
|
}
|
|
|
|
void container(HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(GPCONTAINER)];
|
|
LPGPCONTAINER lpGPCont = (LPGPCONTAINER) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(GPCONTAINER), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(GPCONTAINER) )
|
|
{
|
|
WCHAR sz[256];
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPCont->pwszDSPath, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("pwszDSPath - 0x%08X\t: \"%S\"\n", lpGPCont->pwszDSPath, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPCont->pwszGPOName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("pwszGPONa - 0x%08X\t: \"%S\"\n", lpGPCont->pwszGPOName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPCont->pwszDisplayName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("pwszDisplayName - 0x%08X\t: \"%S\"\n", lpGPCont->pwszDisplayName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpGPCont->pwszFileSysPath, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("pwszFileSysPath - 0x%08X\t: \"%S\"\n", lpGPCont->pwszFileSysPath, bOk ? sz : L"" );
|
|
|
|
dprintf("bFound - %s\n", Boolean( lpGPCont->bFound ) );
|
|
dprintf("bAccessDenied - %s\n", Boolean( lpGPCont->bAccessDenied ) );
|
|
dprintf("bUserDisabled - %s\n", Boolean( lpGPCont->bUserDisabled ) );
|
|
dprintf("bMachDisabled - %s\n", Boolean( lpGPCont->bMachDisabled ) );
|
|
|
|
dprintf("dwUserVersion - 0x%08X\n", lpGPCont->dwUserVersion );
|
|
dprintf("dwMachVersion - 0x%08X\n", lpGPCont->dwMachVersion );
|
|
dprintf("pSD - 0x%08X\n", lpGPCont->pSD );
|
|
dprintf("cbSDLen - 0x%08X\n", lpGPCont->cbSDLen );
|
|
dprintf("pNext - 0x%08X\n", lpGPCont->pNext );
|
|
}
|
|
}
|
|
|
|
void som( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(SCOPEOFMGMT)];
|
|
LPSCOPEOFMGMT lpSOM = (LPSCOPEOFMGMT) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(SCOPEOFMGMT), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(SCOPEOFMGMT) )
|
|
{
|
|
WCHAR sz[128];
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpSOM->pwszSOMId, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("pwszSOMId - 0x%08X\t: \"%S\"\n", lpSOM->pwszSOMId, bOk ? sz : L"" );
|
|
dprintf("dwType - 0x%08X\n", lpSOM->dwType );
|
|
dprintf("bBlocking - %s\n", Boolean( lpSOM->bBlocking ) );
|
|
dprintf("pGpLinkList - 0x%08X\n", lpSOM->pGpLinkList );
|
|
}
|
|
}
|
|
|
|
void profile( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(USERPROFILE)];
|
|
LPPROFILE lpProf = (LPPROFILE) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(USERPROFILE), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(USERPROFILE) )
|
|
{
|
|
WCHAR sz[128];
|
|
|
|
dprintf("dwFlags - 0x%08X\n", lpProf->dwFlags );
|
|
dprintf("dwInternalFlags - 0x%08X\n", lpProf->dwInternalFlags );
|
|
dprintf("dwUserPreference - 0x%08X\n", lpProf->dwUserPreference );
|
|
dprintf("hToken - 0x%08X\n", lpProf->hToken );
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpUserName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpUserName - 0x%08X\t: \"%S\"\n", lpProf->lpUserName, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpProfilePath, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpProfilePath - 0x%08X\t: \"%S\"\n", lpProf->lpProfilePath, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpRoamingProfile, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpRoamingProfile - 0x%08X\t: \"%S\"\n", lpProf->lpRoamingProfile, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpDefaultProfile, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpDefaultProfile - 0x%08X\t: \"%S\"\n", lpProf->lpDefaultProfile, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpLocalProfile, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpLocalProfile - 0x%08X\t: \"%S\"\n", lpProf->lpLocalProfile, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpPolicyPath, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpPolicyPath - 0x%08X\t: \"%S\"\n", lpProf->lpPolicyPath, bOk ? sz : L"" );
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpServerName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpServerName - 0x%08X\t: \"%S\"\n", lpProf->lpServerName, bOk ? sz : L"" );
|
|
|
|
dprintf("hKeyCurrentUser - 0x%08X\n", lpProf->hKeyCurrentUser );
|
|
|
|
dprintf("ftProfileLoad - 0x%08X:0x%08X\n", lpProf->ftProfileLoad.dwLowDateTime, lpProf->ftProfileLoad.dwHighDateTime );
|
|
dprintf("ftProfileUnload - 0x%08X:0x%08X\n", lpProf->ftProfileUnload.dwLowDateTime, lpProf->ftProfileUnload.dwHighDateTime );
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) lpProf->lpExclusionList, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf("lpExclusionList - 0x%08X\t: \"%S\"\n", lpProf->lpExclusionList, bOk ? sz : L"" );
|
|
}
|
|
}
|
|
|
|
void
|
|
debuglevel( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
|
|
DWORD dwDebugLevelPtr = 0;
|
|
|
|
dwDebugLevelPtr = GetExpression( "userenv!dwDebugLevel" );
|
|
|
|
if ( dwDebugLevelPtr )
|
|
{
|
|
unsigned char buffer[sizeof(DWORD)];
|
|
LPDWORD lpdw = (LPDWORD) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwDebugLevelPtr, buffer, sizeof(DWORD), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(DWORD) )
|
|
{
|
|
dprintf("0x%08X\n", *lpdw );
|
|
}
|
|
|
|
/*
|
|
if ( lpArgumentString && isxdigit( *lpArgumentString ) )
|
|
{
|
|
DWORD dwValue = GetExpression(lpArgumentString);
|
|
dprintf("%x, Writing 0x%X at 0x%X\n", ExtensionApis.lpWriteProcessMemoryRoutine, dwValue, dwDebugLevelPtr );
|
|
WriteMemoryExt( hCurrentProcess, (void*) dwDebugLevelPtr, (void*) dwValue, sizeof( DWORD ), 0 );
|
|
}
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
dprintf("Could not resolve symbol dwDebugLevel in module userenv!\n" );
|
|
}
|
|
}
|
|
|
|
void
|
|
globals( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
}
|
|
|
|
void sizes( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
PRINT_SIZE(GPEXT);
|
|
PRINT_SIZE(GPLINK);
|
|
PRINT_SIZE(SCOPEOFMGMT);
|
|
PRINT_SIZE(GPCONTAINER);
|
|
PRINT_SIZE(GPOINFO);
|
|
PRINT_SIZE(USERPROFILE);
|
|
}
|
|
|
|
|
|
void dmpregtable( HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
DWORD dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
LPSTR lpArgumentString )
|
|
{
|
|
ExtensionRoutinePrologue();
|
|
unsigned char buffer[sizeof(REGHASHTABLE)];
|
|
LPREGHASHTABLE pHashTable = (LPREGHASHTABLE) buffer;
|
|
DWORD dwBytesRead = 0;
|
|
int i;
|
|
BOOL bError=FALSE;
|
|
|
|
BOOL bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) dwAddr, buffer, sizeof(REGHASHTABLE), &dwBytesRead );
|
|
|
|
if ( bOk && dwBytesRead == sizeof(REGHASHTABLE) )
|
|
{
|
|
WCHAR sz[128];
|
|
|
|
dprintf("Dumping Registry HashTable at Location 0x%08X\n", dwAddr );
|
|
for ( i=0; i<HASH_TABLE_SIZE; i++ ) {
|
|
|
|
REGKEYENTRY *pKeyEntry = pHashTable->aHashTable[i];
|
|
REGKEYENTRY KeyEntry;
|
|
|
|
if (pKeyEntry)
|
|
dprintf("Hash Bucket 0x%X\n", i);
|
|
|
|
while ( pKeyEntry ) {
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pKeyEntry, &KeyEntry, sizeof(REGKEYENTRY), &dwBytesRead );
|
|
if (!bOk || dwBytesRead != sizeof(REGKEYENTRY) ) {
|
|
dprintf(" !!Couldn't read keyEntry at 0x%08X. quitting..\n", pKeyEntry);
|
|
bError = TRUE;
|
|
break;
|
|
}
|
|
dprintf(" KeyEntry at 0x%08X\n", pKeyEntry);
|
|
|
|
pKeyEntry = &KeyEntry;
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pKeyEntry->pwszKeyName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf(" pwszKeyName - 0x%08X\t: \"%S\"\n", pKeyEntry->pwszKeyName, pKeyEntry->pwszKeyName?sz:L"<NULL>");
|
|
|
|
|
|
REGVALUEENTRY *pValueList=pKeyEntry->pValueList;
|
|
REGVALUEENTRY ValueList;
|
|
|
|
while ( pValueList ) {
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pValueList, &ValueList, sizeof(REGVALUEENTRY), &dwBytesRead );
|
|
if (!bOk || dwBytesRead != sizeof(REGVALUEENTRY) ) {
|
|
dprintf(" !!Couldn't read ValueEntry at 0x%08X. quitting..\n", pValueList);
|
|
bError = TRUE;
|
|
break;
|
|
}
|
|
dprintf(" ValueEntry at 0x%08X\n", pValueList);
|
|
|
|
pValueList = &ValueList;
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pValueList->pwszValueName, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf(" pwszValueName - 0x%08X\t: \"%S\"\n", pValueList->pwszValueName, pValueList->pwszValueName?sz:L"<NULL>");
|
|
|
|
|
|
REGDATAENTRY *pDataList = pValueList->pDataList;
|
|
REGDATAENTRY DataList;
|
|
|
|
while ( pDataList ) {
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pDataList, &DataList, sizeof(REGDATAENTRY), &dwBytesRead );
|
|
if (!bOk || dwBytesRead != sizeof(REGDATAENTRY) ) {
|
|
dprintf(" !!Couldn't read DataEntry at 0x%08X. quitting..\n", pDataList);
|
|
bError = TRUE;
|
|
break;
|
|
}
|
|
dprintf(" **DataEntry** at 0x%08X\n", pDataList);
|
|
|
|
pDataList = &DataList;
|
|
|
|
|
|
dprintf(" bDeleted - %s\n", pDataList->bDeleted?"TRUE":"FALSE");
|
|
dprintf(" bAdmPolicy - %s\n", pDataList->bAdmPolicy?"TRUE":"FALSE");
|
|
dprintf(" dwValueType - 0x%X\n", pDataList->dwValueType);
|
|
dprintf(" dwDataLen - 0x%X\n", pDataList->dwDataLen);
|
|
dprintf(" pData - 0x%08X\n", pDataList->pData);
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pDataList->pwszGPO, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf(" pwszGPO - 0x%08X\t: \"%S\"\n", pDataList->pwszGPO, pDataList->pwszGPO?sz:L"<NULL>");
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pDataList->pwszSOM, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf(" pwszSOM - 0x%08X\t: \"%S\"\n", pDataList->pwszSOM, pDataList->pwszSOM?sz:L"<NULL>");
|
|
|
|
|
|
bOk = ReadMemoryExt( hCurrentProcess, ( const void * ) pDataList->pwszCommand, sz, sizeof(WCHAR) * 128, &dwBytesRead );
|
|
sz[127] = 0;
|
|
dprintf(" pwszCommand - 0x%08X\t: \"%S\"\n", pDataList->pwszCommand, pDataList->pwszCommand?sz:L"<NULL>");
|
|
|
|
if (bError)
|
|
break;
|
|
|
|
pDataList = pDataList->pNext;
|
|
|
|
} // While pDataList
|
|
|
|
if (bError)
|
|
break;
|
|
|
|
pValueList = pValueList->pNext;
|
|
} // While pValue
|
|
|
|
if (bError)
|
|
break;
|
|
|
|
pKeyEntry = pKeyEntry->pNext;
|
|
dprintf("\n");
|
|
|
|
} // while pKey
|
|
|
|
if (bError)
|
|
break;
|
|
}
|
|
|
|
} // for
|
|
|
|
}
|
|
|