/*++ Copyright (C) Microsoft Corporation, 1990 - 2000 All rights reserved. Module Name: dbgutil.c Abstract: This module provides all the Spooler Subsystem Debugger utility functions. Author: Krishna Ganugapati (KrishnaG) 1-July-1993 Revision History: --*/ #include "precomp.h" #pragma hdrstop #include "dbglocal.h" #include "dbgsec.h" SYSTEM_INFO gSysInfo; DWORD EvalValue( LPSTR *pptstr, PNTSD_GET_EXPRESSION EvalExpression, PNTSD_OUTPUT_ROUTINE Print) { LPSTR lpArgumentString; LPSTR lpAddress; DWORD dw; char ach[80]; UINT_PTR cch; UNREFERENCED_PARAMETER(Print); lpArgumentString = *pptstr; while (isspace(*lpArgumentString)) lpArgumentString++; lpAddress = lpArgumentString; while ((!isspace(*lpArgumentString)) && (*lpArgumentString != 0)) lpArgumentString++; cch = (UINT_PTR)lpArgumentString - (UINT_PTR)lpAddress; if (cch > 79) cch = 79; StringCchCopyA(ach, (UINT)cch, lpAddress); dw = (DWORD)EvalExpression(lpAddress); *pptstr = lpArgumentString; return dw; } VOID ConvertSidToAsciiString( PSID pSid, LPSTR String, size_t cchString ) /*++ Routine Description: This function generates a printable unicode string representation of a SID. The resulting string will take one of two forms. If the IdentifierAuthority value is not greater than 2^32, then the SID will be in the form: S-1-281736-12-72-9-110 ^ ^^ ^^ ^ ^^^ | | | | | +-----+--+-+--+---- Decimal Otherwise it will take the form: S-1-0x173495281736-12-72-9-110 ^^^^^^^^^^^^^^ ^^ ^^ ^ ^^^ Hexidecimal | | | | +--+-+--+---- Decimal Arguments: pSid - opaque pointer that supplies the SID that is to be converted to Unicode. Return Value: If the Sid is successfully converted to a Unicode string, a pointer to the Unicode string is returned, else NULL is returned. --*/ { UCHAR Buffer[256]; UCHAR i; ULONG Tmp; SID_IDENTIFIER_AUTHORITY *pSidIdentifierAuthority; PUCHAR pSidSubAuthorityCount; if (!IsValidSid( pSid )) { *String= '\0'; return; } StringCchPrintfA(Buffer, COUNTOF(Buffer), "S-%u-", (USHORT)(((PISID)pSid)->Revision )); StringCchCopyA(String, cchString, Buffer); pSidIdentifierAuthority = GetSidIdentifierAuthority(pSid); if ( (pSidIdentifierAuthority->Value[0] != 0) || (pSidIdentifierAuthority->Value[1] != 0) ){ StringCchPrintfA(Buffer, COUNTOF(Buffer), "0x%02hx%02hx%02hx%02hx%02hx%02hx", (USHORT)pSidIdentifierAuthority->Value[0], (USHORT)pSidIdentifierAuthority->Value[1], (USHORT)pSidIdentifierAuthority->Value[2], (USHORT)pSidIdentifierAuthority->Value[3], (USHORT)pSidIdentifierAuthority->Value[4], (USHORT)pSidIdentifierAuthority->Value[5] ); StringCchCatA(String, cchString, Buffer); } else { Tmp = (ULONG)pSidIdentifierAuthority->Value[5] + (ULONG)(pSidIdentifierAuthority->Value[4] << 8) + (ULONG)(pSidIdentifierAuthority->Value[3] << 16) + (ULONG)(pSidIdentifierAuthority->Value[2] << 24); StringCchPrintfA(Buffer, COUNTOF(Buffer), "%lu", Tmp); StringCchCatA(String, cchString, Buffer); } pSidSubAuthorityCount = GetSidSubAuthorityCount(pSid); for (i=0;i< *(pSidSubAuthorityCount);i++ ) { StringCchPrintfA(Buffer, COUNTOF(Buffer), "-%lu", *(GetSidSubAuthority(pSid, i))); StringCchCatA(String, cchString, Buffer); } } BOOL ReadProcessString( IN HANDLE hProcess, IN LPCVOID lpBaseAddress, OUT LPVOID lpBuffer, IN SIZE_T nSize, OUT SIZE_T *lpNumberOfBytesRead ) { BOOL bRetval = FALSE; SIZE_T cbRead = 0; UINT_PTR nAddress = 0; // // Attempt to read the memory, up to the provided size. // bRetval = ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, &cbRead); // // The string in the debugged process may have unmapped memory just after // the end of the string, (this is true when page heap is enabled), // // If the read failed and the address plus the string buffer size crosses // a page boundary then retry the operation up to the page end. // if (!bRetval) { nAddress = (UINT_PTR)lpBaseAddress; // // If we have crossed a page boundary. // if (((nAddress & (gSysInfo.dwPageSize-1)) + nSize) > gSysInfo.dwPageSize-1) { nSize = (SIZE_T)((gSysInfo.dwPageSize-1) - (nAddress & (gSysInfo.dwPageSize-1))); bRetval = ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, &cbRead); } } // // The read succeeded. // if (bRetval) { // // If the caller wants to know the number of bytes read. // if (lpNumberOfBytesRead) { *lpNumberOfBytesRead = cbRead; } } return bRetval; } // // Query the system for the page size. // BOOL QuerySystemInformation( VOID ) { GetSystemInfo(&gSysInfo); return TRUE; }