mirror of
https://github.com/reactos/reactos.git
synced 2026-06-25 11:07:13 +08:00
205 lines
4.3 KiB
C
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]);
|
|
}
|