Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311/* * 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 ******************************************************************/
BOOLIsDecString( _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;}
BOOLIsHexString( _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;}
BOOLHasPrefix( _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);}
ULONGLONGRoundingDivide( _In_ ULONGLONG Dividend, _In_ ULONGLONG Divisor){ return (Dividend + Divisor / 2) / Divisor;}
PWSTRDuplicateQuotedString( _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;}
PWSTRDuplicateString( _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;}
VOIDCreateGUID( _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;}
VOIDCreateSignature( _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);}
VOIDPrintGUID( _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]);}
staticBYTECharToByte( WCHAR Char){ if (iswdigit(Char)) { return (BYTE)((INT)Char - (INT)'0'); } else if (iswalpha(Char)) { if (iswupper(Char)) return (INT)Char - ((INT)'A' - 10); else return (INT)Char - ((INT)'a' - 10); } return 0;}
BOOLStringToGUID( _Out_ GUID *pGuid, _In_ PWSTR pszString){ INT i;
if (pszString == NULL) return FALSE;
pGuid->Data1 = 0; for (i = 0; i < 8; i++) { if (!iswxdigit(pszString[i])) return FALSE;
pGuid->Data1 = (pGuid->Data1 << 4) | CharToByte(pszString[i]); }
if (pszString[8] != L'-') return FALSE;
pGuid->Data2 = 0; for (i = 9; i < 13; i++) { if (!iswxdigit(pszString[i])) return FALSE;
pGuid->Data2 = (pGuid->Data2 << 4) | CharToByte(pszString[i]); }
if (pszString[13] != L'-') return FALSE;
pGuid->Data3 = 0; for (i = 14; i < 18; i++) { if (!iswxdigit(pszString[i])) return FALSE;
pGuid->Data3 = (pGuid->Data3 << 4) | CharToByte(pszString[i]); }
if (pszString[18] != L'-') return FALSE;
for (i = 19; i < 36; i += 2) { if (i == 23) { if (pszString[i] != L'-') return FALSE; i++; }
if (!iswxdigit(pszString[i]) || !iswxdigit(pszString[i + 1])) return FALSE;
pGuid->Data4[(i - 19) / 2] = CharToByte(pszString[i]) << 4 | CharToByte(pszString[i + 1]); }
if (pszString[36] == L'\0') return TRUE;
return FALSE;}
VOIDPrintBusType( _Out_ PWSTR pszBuffer, _In_ INT cchBufferMax, _In_ STORAGE_BUS_TYPE BusType){ if (BusType <= BusTypeMax) LoadStringW(GetModuleHandle(NULL), IDS_BUSTYPE_UNKNOWN + BusType, pszBuffer, cchBufferMax); else LoadStringW(GetModuleHandle(NULL), IDS_BUSTYPE_OTHER, pszBuffer, cchBufferMax);}