windows-nt/Source/XPSP1/NT/base/fs/hsm/kdexts/utils.c
2020-09-26 16:20:57 +08:00

317 lines
5.2 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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);
}