windows-nt/Source/XPSP1/NT/sdktools/pview/util.c
2020-09-26 16:20:57 +08:00

340 lines
7.5 KiB
C

/****************************************************************************
PROGRAM: UTIL.C
PURPOSE: System utility routines
****************************************************************************/
#include "PVIEWP.h"
#include <string.h>
/****************************************************************************
FUNCTION: Alloc
PURPOSE: Allocates memory to hold the specified number of bytes
RETURNS : Pointer to allocated memory or NULL on failure
****************************************************************************/
PVOID Alloc(
ULONG Bytes)
{
HANDLE hMem;
PVOID Buffer;
hMem = LocalAlloc(LMEM_MOVEABLE, Bytes + sizeof(hMem));
if (hMem == NULL) {
return(NULL);
}
// Lock down the memory
//
Buffer = LocalLock(hMem);
if (Buffer == NULL) {
LocalFree(hMem);
return(NULL);
}
//
// Store the handle at the start of the memory block and return
// a pointer to just beyond it.
//
*((PHANDLE)Buffer) = hMem;
return (PVOID)(((PHANDLE)Buffer)+1);
}
/****************************************************************************
FUNCTION: GetAllocSize
PURPOSE: Returns the allocated size of the specified memory block.
The block must have been previously allocated using Alloc
RETURNS : Size of memory block in bytes or 0 on error
****************************************************************************/
ULONG GetAllocSize(
PVOID Buffer)
{
HANDLE hMem;
hMem = *(((PHANDLE)Buffer) - 1);
return (ULONG)(LocalSize(hMem) - sizeof(hMem));
}
/****************************************************************************
FUNCTION: Free
PURPOSE: Frees the memory previously allocated with Alloc
RETURNS : TRUE on success, otherwise FALSE
****************************************************************************/
BOOL Free(
PVOID Buffer)
{
HANDLE hMem;
hMem = *(((PHANDLE)Buffer) - 1);
LocalUnlock(hMem);
return(LocalFree(hMem) == NULL);
}
/****************************************************************************
FUNCTION: LUID2String
PURPOSE: Converts a LUID into a readable string.
RETURNS : TRUE on success otherwise FALSE.
****************************************************************************/
BOOL LUID2String(
LUID Luid,
LPSTR String,
UINT MaxStringBytes)
{
if (Luid.HighPart == 0) {
wsprintf(String, "0x%lx", Luid.LowPart);
} else {
wsprintf(String, "0x%lx%08lx", Luid.HighPart, Luid.LowPart);
}
return(TRUE);
}
/****************************************************************************
FUNCTION: Time2String
PURPOSE: Converts a time into a readable string.
RETURNS : TRUE on success otherwise FALSE.
****************************************************************************/
BOOL Time2String(
TIME Time,
LPSTR String,
UINT MaxStringBytes)
{
TIME_FIELDS TimeFields;
RtlTimeToTimeFields(&Time, &TimeFields);
if (TimeFields.Year > 2900) {
strcpy(String, "Never");
} else {
wsprintf(String, "%d/%d/%d %02d:%02d:%02d",
TimeFields.Year, TimeFields.Month, TimeFields.Day,
TimeFields.Hour, TimeFields.Minute, TimeFields.Second);
}
return(TRUE);
}
/****************************************************************************
FUNCTION: TokenType2String
PURPOSE: Converts a tokentype into a readable string.
RETURNS : TRUE on success otherwise FALSE.
****************************************************************************/
BOOL TokenType2String(
TOKEN_TYPE TokenType,
LPSTR String,
UINT MaxStringBytes)
{
switch (TokenType) {
case TokenPrimary:
strcpy(String, "Primary");
break;
case TokenImpersonation:
strcpy(String, "Impersonation");
break;
default:
DbgPrint("SECEDIT: TokenType2String fed unrecognised token type : 0x%x\n", TokenType);
return(FALSE);
break;
}
return(TRUE);
}
/****************************************************************************
FUNCTION: ImpersonationLevel2String
PURPOSE: Converts an impersonation level into a readable string.
RETURNS : TRUE on success otherwise FALSE.
****************************************************************************/
BOOL ImpersonationLevel2String(
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
LPSTR String,
UINT MaxStringBytes)
{
switch (ImpersonationLevel) {
case SecurityAnonymous:
strcpy(String, "Anonymous");
break;
case SecurityIdentification:
strcpy(String, "Identification");
break;
case SecurityImpersonation:
strcpy(String, "Impersonation");
break;
case SecurityDelegation:
strcpy(String, "Delegation");
break;
default:
DbgPrint("SECEDIT: ImpersonationLevel2String fed unrecognised impersonation level : 0x%x\n", ImpersonationLevel);
return(FALSE);
break;
}
return(TRUE);
}
/****************************************************************************
FUNCTION: Dynamic2String
PURPOSE: Converts an dynamic quota level into a readable string.
RETURNS : TRUE on success otherwise FALSE.
****************************************************************************/
BOOL Dynamic2String(
ULONG Dynamic,
LPSTR String,
UINT MaxStringBytes)
{
wsprintf(String, "%ld", Dynamic);
return(TRUE);
}
/****************************************************************************
FUNCTION: AddItem
PURPOSE: Adds the item string and data to the specified control
The control is assumed to be a list-box unless fCBox == TRUE
in which case the control is assumed to be a ComboBox
RETURNS: Index at which the item was added or < 0 on error
****************************************************************************/
INT AddItem(
HWND hDlg,
INT ControlID,
LPSTR String,
LPARAM Data,
BOOL fCBox)
{
HWND hwnd;
LRESULT iItem;
USHORT AddStringMsg = LB_ADDSTRING;
USHORT SetDataMsg = LB_SETITEMDATA;
if (fCBox) {
AddStringMsg = CB_ADDSTRING;
SetDataMsg = CB_SETITEMDATA;
}
hwnd = GetDlgItem(hDlg, ControlID);
iItem = SendMessage(hwnd, AddStringMsg, 0, (LPARAM)String);
if (iItem >= 0) {
SendMessage(hwnd, SetDataMsg, iItem, Data);
}
return((INT)iItem);
}
/****************************************************************************
FUNCTION: FindSid
PURPOSE: Searches for the specified Sid in a control.
RETURNS: Index of matching item or < 0 on error
****************************************************************************/
INT FindSid(
HWND hDlg,
INT ControlID,
PSID Sid,
BOOL fCBox)
{
HWND hwnd;
INT cItems;
USHORT GetCountMsg = LB_GETCOUNT;
USHORT GetDataMsg = LB_GETITEMDATA;
if (fCBox) {
GetCountMsg = CB_GETCOUNT;
GetDataMsg = CB_GETITEMDATA;
}
hwnd = GetDlgItem(hDlg, ControlID);
cItems = (INT)SendMessage(hwnd, GetCountMsg, 0, 0);
if (cItems >= 0) {
INT iItem;
PSID ItemSid;
for (iItem =0; iItem < cItems; iItem ++) {
ItemSid = (PSID)SendMessage(hwnd, GetDataMsg, (WPARAM)iItem, 0);
if (RtlEqualSid(ItemSid, Sid)) {
return(iItem);
}
}
}
return(-1);
}