/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: Security Account Manager (SAM) Server * FILE: reactos/dll/win32/samsrv/utils.c * PURPOSE: Utility functions * * PROGRAMMERS: Eric Kohl */ #include "samsrv.h" #include /* FUNCTIONS ***************************************************************/ INT SampLoadString(HINSTANCE hInstance, UINT uId, LPWSTR lpBuffer, INT nBufferMax) { HGLOBAL hmem; HRSRC hrsrc; WCHAR *p; int string_num; int i; /* Use loword (incremented by 1) as resourceid */ hrsrc = FindResourceW(hInstance, MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1), (LPWSTR)RT_STRING); if (!hrsrc) return 0; hmem = LoadResource(hInstance, hrsrc); if (!hmem) return 0; p = LockResource(hmem); string_num = uId & 0x000f; for (i = 0; i < string_num; i++) p += *p + 1; i = min(nBufferMax - 1, *p); if (i > 0) { memcpy(lpBuffer, p + 1, i * sizeof(WCHAR)); lpBuffer[i] = 0; } else { if (nBufferMax > 1) { lpBuffer[0] = 0; return 0; } } return i; } BOOL SampIsSetupRunning(VOID) { DWORD dwError; HKEY hKey; DWORD dwType; DWORD dwSize; DWORD dwSetupType; TRACE("SampIsSetupRunning()\n"); /* Open key */ dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", 0, KEY_QUERY_VALUE, &hKey); if (dwError != ERROR_SUCCESS) return FALSE; /* Read key */ dwSize = sizeof(DWORD); dwError = RegQueryValueExW(hKey, L"SetupType", NULL, &dwType, (LPBYTE)&dwSetupType, &dwSize); /* Close key, and check if returned values are correct */ RegCloseKey(hKey); if (dwError != ERROR_SUCCESS || dwType != REG_DWORD || dwSize != sizeof(DWORD)) return FALSE; TRACE("SampIsSetupRunning() returns %s\n", (dwSetupType != 0) ? "TRUE" : "FALSE"); return (dwSetupType != 0); } PSID AppendRidToSid(PSID SrcSid, ULONG Rid) { ULONG Rids[8] = {0, 0, 0, 0, 0, 0, 0, 0}; UCHAR RidCount; PSID DstSid; ULONG i; RidCount = *RtlSubAuthorityCountSid(SrcSid); if (RidCount >= 8) return NULL; for (i = 0; i < RidCount; i++) Rids[i] = *RtlSubAuthoritySid(SrcSid, i); Rids[RidCount] = Rid; RidCount++; RtlAllocateAndInitializeSid(RtlIdentifierAuthoritySid(SrcSid), RidCount, Rids[0], Rids[1], Rids[2], Rids[3], Rids[4], Rids[5], Rids[6], Rids[7], &DstSid); return DstSid; } NTSTATUS SampGetRidFromSid(IN PSID Sid, OUT PULONG Rid) { UCHAR RidCount; RidCount = *RtlSubAuthorityCountSid(Sid); if (RidCount < 1) return STATUS_INVALID_SID; *Rid = *RtlSubAuthoritySid(Sid, RidCount - 1); return STATUS_SUCCESS; } NTSTATUS SampCheckAccountName(IN PRPC_UNICODE_STRING AccountName, IN USHORT MaxLength) { if (AccountName->Length > MaxLength * sizeof(WCHAR)) return STATUS_INVALID_ACCOUNT_NAME; return STATUS_SUCCESS; } /* EOF */