Files
reactos/base/system/diskpart/misc.c
Eric Kohl 920153534b [DISKPART] Implement the 'convert mbr' and 'convert gpt' commands
- Show Disk UUIDs in the 'detail disk' and 'uniqueid disk' commands.
2025-12-07 10:10:10 +01:00

205 lines
4.3 KiB
C

/*
* PROJECT: ReactOS DiskPart
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/system/diskpart/misc.c
* PURPOSE: Manages all the partitions of the OS in an interactive way.
* PROGRAMMERS: Eric Kohl
*/
#include "diskpart.h"
/* FUNCTIONS ******************************************************************/
BOOL
IsDecString(
_In_ PWSTR pszDecString)
{
PWSTR ptr;
if ((pszDecString == NULL) || (*pszDecString == UNICODE_NULL))
return FALSE;
ptr = pszDecString;
while (*ptr != UNICODE_NULL)
{
if (!iswdigit(*ptr))
return FALSE;
ptr++;
}
return TRUE;
}
BOOL
IsHexString(
_In_ PWSTR pszHexString)
{
PWSTR ptr;
if ((pszHexString == NULL) || (*pszHexString == UNICODE_NULL))
return FALSE;
ptr = pszHexString;
while (*ptr != UNICODE_NULL)
{
if (!iswxdigit(*ptr))
return FALSE;
ptr++;
}
return TRUE;
}
BOOL
HasPrefix(
_In_ PWSTR pszString,
_In_ PWSTR pszPrefix,
_Out_opt_ PWSTR *ppszSuffix)
{
INT nPrefixLength, ret;
nPrefixLength = wcslen(pszPrefix);
ret = _wcsnicmp(pszString, pszPrefix, nPrefixLength);
if ((ret == 0) && (ppszSuffix != NULL))
*ppszSuffix = &pszString[nPrefixLength];
return (ret == 0);
}
ULONGLONG
RoundingDivide(
_In_ ULONGLONG Dividend,
_In_ ULONGLONG Divisor)
{
return (Dividend + Divisor / 2) / Divisor;
}
PWSTR
DuplicateQuotedString(
_In_ PWSTR pszInString)
{
PWSTR pszOutString = NULL;
PWSTR pStart, pEnd;
INT nLength;
if ((pszInString == NULL) || (pszInString[0] == UNICODE_NULL))
return NULL;
if (pszInString[0] == L'"')
{
if (pszInString[1] == UNICODE_NULL)
return NULL;
pStart = &pszInString[1];
pEnd = wcschr(pStart, '"');
if (pEnd == NULL)
{
nLength = wcslen(pStart);
}
else
{
nLength = (pEnd - pStart);
}
}
else
{
pStart = pszInString;
nLength = wcslen(pStart);
}
pszOutString = RtlAllocateHeap(RtlGetProcessHeap(),
HEAP_ZERO_MEMORY,
(nLength + 1) * sizeof(WCHAR));
if (pszOutString == NULL)
return NULL;
wcsncpy(pszOutString, pStart, nLength);
return pszOutString;
}
PWSTR
DuplicateString(
_In_ PWSTR pszInString)
{
PWSTR pszOutString = NULL;
INT nLength;
if ((pszInString == NULL) || (pszInString[0] == UNICODE_NULL))
return NULL;
nLength = wcslen(pszInString);
pszOutString = RtlAllocateHeap(RtlGetProcessHeap(),
HEAP_ZERO_MEMORY,
(nLength + 1) * sizeof(WCHAR));
if (pszOutString == NULL)
return NULL;
wcscpy(pszOutString, pszInString);
return pszOutString;
}
VOID
CreateGUID(
_Out_ GUID *pGuid)
{
RtlGenRandom(pGuid, sizeof(*pGuid));
/* Clear the version bits and set the version (4) */
pGuid->Data3 &= 0x0fff;
pGuid->Data3 |= (4 << 12);
/* Set the topmost bits of Data4 (clock_seq_hi_and_reserved) as
* specified in RFC 4122, section 4.4.
*/
pGuid->Data4[0] &= 0x3f;
pGuid->Data4[0] |= 0x80;
}
VOID
CreateSignature(
_Out_ PDWORD pSignature)
{
LARGE_INTEGER SystemTime;
TIME_FIELDS TimeFields;
PUCHAR Buffer;
NtQuerySystemTime(&SystemTime);
RtlTimeToTimeFields(&SystemTime, &TimeFields);
Buffer = (PUCHAR)pSignature;
Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
}
VOID
PrintGUID(
_Out_ PWSTR pszBuffer,
_In_ GUID *pGuid)
{
swprintf(pszBuffer,
L"%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
pGuid->Data1,
pGuid->Data2,
pGuid->Data3,
pGuid->Data4[0],
pGuid->Data4[1],
pGuid->Data4[2],
pGuid->Data4[3],
pGuid->Data4[4],
pGuid->Data4[5],
pGuid->Data4[6],
pGuid->Data4[7]);
}