317 lines
5.2 KiB
C
317 lines
5.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
utils.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Various utility routines used by the extensions.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Ravisankar Pudipeddi
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
#include "local.h"
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
xdprintf(
|
|||
|
ULONG Depth,
|
|||
|
PCCHAR S,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
va_list ap;
|
|||
|
ULONG i;
|
|||
|
CCHAR DebugBuffer[256];
|
|||
|
|
|||
|
for (i=0; i<Depth; i++) {
|
|||
|
dprintf (" ");
|
|||
|
}
|
|||
|
|
|||
|
va_start(ap, S);
|
|||
|
|
|||
|
vsprintf(DebugBuffer, S, ap);
|
|||
|
|
|||
|
dprintf (DebugBuffer);
|
|||
|
|
|||
|
va_end(ap);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
xReadMemory (
|
|||
|
ULONG64 Src,
|
|||
|
PVOID Dst,
|
|||
|
ULONG Len
|
|||
|
)
|
|||
|
{
|
|||
|
ULONG result;
|
|||
|
|
|||
|
return (ReadMemory (Src, Dst, Len, &result) && (result == Len));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ULONG GetUlongFromAddress (ULONG64 Location)
|
|||
|
{
|
|||
|
ULONG Value = 0;
|
|||
|
ULONG result;
|
|||
|
|
|||
|
if ((!ReadMemory (Location, &Value, sizeof (ULONG), &result)) || (result < sizeof (ULONG)))
|
|||
|
{
|
|||
|
dprintf ("unable to read from %08x\n", Location);
|
|||
|
}
|
|||
|
|
|||
|
return (Value);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ULONG64 GetPointerFromAddress (ULONG64 Location)
|
|||
|
{
|
|||
|
ULONG64 Value = 0;
|
|||
|
ULONG result;
|
|||
|
|
|||
|
if (ReadPointer (Location, &Value))
|
|||
|
{
|
|||
|
dprintf ("unable to read from %016p\n", Location);
|
|||
|
}
|
|||
|
|
|||
|
return (Value);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ULONG GetUlongValue (PCHAR String)
|
|||
|
{
|
|||
|
ULONG64 Location;
|
|||
|
ULONG Value = 0;
|
|||
|
ULONG result;
|
|||
|
|
|||
|
|
|||
|
Location = GetExpression (String);
|
|||
|
|
|||
|
if (!Location)
|
|||
|
{
|
|||
|
dprintf ("unable to get %s\n", String);
|
|||
|
}
|
|||
|
|
|||
|
return GetUlongFromAddress( Location );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ULONG64 GetPointerValue (PCHAR String)
|
|||
|
{
|
|||
|
ULONG64 Location;
|
|||
|
ULONG64 Value = 0;
|
|||
|
|
|||
|
|
|||
|
Location = GetExpression (String);
|
|||
|
|
|||
|
if (!Location)
|
|||
|
{
|
|||
|
dprintf ("unable to get %s\n", String);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ReadPointer (Location, &Value);
|
|||
|
|
|||
|
return (Value);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ULONG GetFieldValueUlong32 (ULONG64 ul64addrStructureBase,
|
|||
|
PCHAR pchStructureType,
|
|||
|
PCHAR pchFieldname)
|
|||
|
{
|
|||
|
ULONG ulReturnValue = 0;
|
|||
|
|
|||
|
|
|||
|
GetFieldValue (ul64addrStructureBase, pchStructureType, pchFieldname, ulReturnValue);
|
|||
|
|
|||
|
return (ulReturnValue);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ULONG64 GetFieldValueUlong64 (ULONG64 ul64addrStructureBase,
|
|||
|
PCHAR pchStructureType,
|
|||
|
PCHAR pchFieldname)
|
|||
|
{
|
|||
|
ULONG64 ul64ReturnValue = 0;
|
|||
|
|
|||
|
|
|||
|
GetFieldValue (ul64addrStructureBase, pchStructureType, pchFieldname, ul64ReturnValue);
|
|||
|
|
|||
|
return (ul64ReturnValue);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ULONG FormatDateAndTime (ULONG64 ul64Time, PCHAR pszFormattedDateAndTime, ULONG ulBufferLength)
|
|||
|
{
|
|||
|
FILETIME ftTimeOriginal;
|
|||
|
FILETIME ftTimeLocal;
|
|||
|
SYSTEMTIME stTimeSystem;
|
|||
|
CHAR achFormattedDateString [200];
|
|||
|
CHAR achFormattedTimeString [200];
|
|||
|
DWORD dwStatus = 0;
|
|||
|
BOOL bSucceeded = FALSE;
|
|||
|
ULARGE_INTEGER uliConversionTemp;
|
|||
|
int iReturnValue;
|
|||
|
|
|||
|
|
|||
|
uliConversionTemp.QuadPart = ul64Time;
|
|||
|
|
|||
|
ftTimeOriginal.dwLowDateTime = uliConversionTemp.LowPart;
|
|||
|
ftTimeOriginal.dwHighDateTime = uliConversionTemp.HighPart;
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
bSucceeded = FileTimeToLocalFileTime (&ftTimeOriginal, &ftTimeLocal);
|
|||
|
|
|||
|
if (!bSucceeded)
|
|||
|
{
|
|||
|
dwStatus = GetLastError ();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
bSucceeded = FileTimeToSystemTime (&ftTimeLocal, &stTimeSystem);
|
|||
|
|
|||
|
if (!bSucceeded)
|
|||
|
{
|
|||
|
dwStatus = GetLastError ();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
iReturnValue = GetDateFormat (LOCALE_USER_DEFAULT,
|
|||
|
0,
|
|||
|
&stTimeSystem,
|
|||
|
NULL,
|
|||
|
achFormattedDateString,
|
|||
|
sizeof (achFormattedDateString) / sizeof (CHAR));
|
|||
|
|
|||
|
if (0 == iReturnValue)
|
|||
|
{
|
|||
|
dwStatus = GetLastError ();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
iReturnValue = GetTimeFormat (LOCALE_USER_DEFAULT,
|
|||
|
0,
|
|||
|
&stTimeSystem,
|
|||
|
NULL,
|
|||
|
achFormattedTimeString,
|
|||
|
sizeof (achFormattedTimeString) / sizeof (CHAR));
|
|||
|
|
|||
|
if (0 == iReturnValue)
|
|||
|
{
|
|||
|
dwStatus = GetLastError ();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
iReturnValue = _snprintf (pszFormattedDateAndTime,
|
|||
|
ulBufferLength / sizeof (CHAR),
|
|||
|
"%s %s",
|
|||
|
achFormattedDateString,
|
|||
|
achFormattedTimeString);
|
|||
|
|
|||
|
if (iReturnValue < 0)
|
|||
|
{
|
|||
|
dwStatus = ERROR_INSUFFICIENT_BUFFER;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
dwStatus = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (0 != dwStatus)
|
|||
|
{
|
|||
|
if (0 == ul64Time)
|
|||
|
{
|
|||
|
_snprintf (pszFormattedDateAndTime,
|
|||
|
ulBufferLength / sizeof (CHAR),
|
|||
|
"Date/Time not specified");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_snprintf (pszFormattedDateAndTime,
|
|||
|
ulBufferLength / sizeof (CHAR),
|
|||
|
"Date/Time invalid");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
return (dwStatus);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
** {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
|
|||
|
*/
|
|||
|
ULONG FormatGUID (GUID guidValue, PCHAR pszFormattedGUID, ULONG ulBufferLength)
|
|||
|
{
|
|||
|
DWORD dwStatus = 0;
|
|||
|
|
|||
|
|
|||
|
if (sizeof ("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") > ulBufferLength)
|
|||
|
{
|
|||
|
dwStatus = ERROR_INSUFFICIENT_BUFFER;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (0 == dwStatus)
|
|||
|
{
|
|||
|
_snprintf (pszFormattedGUID, ulBufferLength, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
|||
|
guidValue.Data1,
|
|||
|
guidValue.Data2,
|
|||
|
guidValue.Data3,
|
|||
|
guidValue.Data4[0],
|
|||
|
guidValue.Data4[1],
|
|||
|
guidValue.Data4[2],
|
|||
|
guidValue.Data4[3],
|
|||
|
guidValue.Data4[4],
|
|||
|
guidValue.Data4[5],
|
|||
|
guidValue.Data4[6],
|
|||
|
guidValue.Data4[7]);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return (dwStatus);
|
|||
|
}
|