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.
232 lines
5.6 KiB
232 lines
5.6 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|