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);
|
||
}
|