340 lines
7.5 KiB
C
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);
|
|
}
|
|
|
|
|