#include #include #include #include "windows.h" #include "ntdll.h" #include "xmalloc.h" #include "stddebug.h" #include "debug.h" BOOL32 WINAPI IsValidSid (LPSID pSid); BOOL32 WINAPI EqualSid (LPSID pSid1, LPSID pSid2); BOOL32 WINAPI EqualPrefixSid (LPSID pSid1, LPSID pSid2); DWORD WINAPI GetSidLengthRequired (BYTE nSubAuthorityCount); BOOL32 WINAPI AllocateAndInitializeSid(LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, LPSID *pSid); VOID* WINAPI FreeSid(LPSID pSid); BOOL32 WINAPI InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount); LPSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(LPSID pSid); DWORD* WINAPI GetSidSubAuthority(LPSID pSid, DWORD nSubAuthority); BYTE* WINAPI GetSidSubAuthorityCount(LPSID pSid); DWORD WINAPI GetLengthSid(LPSID pSid); BOOL32 WINAPI CopySid(DWORD nDestinationSidLength, LPSID pDestinationSid, LPSID pSourceSid); /*********************************************************************** * IsValidSid (ADVAPI.80) */ BOOL32 WINAPI IsValidSid (LPSID pSid) { if (!pSid || pSid->Revision != SID_REVISION) return FALSE; return TRUE; } /*********************************************************************** * EqualSid (ADVAPI.40) */ BOOL32 WINAPI EqualSid (LPSID pSid1, LPSID pSid2) { if (!IsValidSid(pSid1) || !IsValidSid(pSid2)) return FALSE; if (*GetSidSubAuthorityCount(pSid1) != *GetSidSubAuthorityCount(pSid2)) return FALSE; if (memcmp(pSid1, pSid2, GetLengthSid(pSid1)) != 0) return FALSE; return TRUE; } /*********************************************************************** * EqualPrefixSid (ADVAPI.39) */ BOOL32 WINAPI EqualPrefixSid (LPSID pSid1, LPSID pSid2) { if (!IsValidSid(pSid1) || !IsValidSid(pSid2)) return FALSE; if (*GetSidSubAuthorityCount(pSid1) != *GetSidSubAuthorityCount(pSid2)) return FALSE; if (memcmp(pSid1, pSid2, GetSidLengthRequired(pSid1->SubAuthorityCount - 1)) != 0) return FALSE; return TRUE; } /*********************************************************************** * GetSidLengthRequired (ADVAPI.63) */ DWORD WINAPI GetSidLengthRequired (BYTE nSubAuthorityCount) { return sizeof (SID) + (nSubAuthorityCount - 1 * sizeof (DWORD)); } /*********************************************************************** * AllocateAndInitializeSid (ADVAPI.11) */ BOOL32 WINAPI AllocateAndInitializeSid(LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, LPSID *pSid) { *pSid = xmalloc(GetSidLengthRequired(nSubAuthorityCount)); (*pSid)->Revision = SID_REVISION; if (pIdentifierAuthority) memcpy(&(*pSid)->IdentifierAuthority, pIdentifierAuthority, sizeof (SID_IDENTIFIER_AUTHORITY)); *GetSidSubAuthorityCount(*pSid) = nSubAuthorityCount; if (nSubAuthorityCount > 0) *GetSidSubAuthority(*pSid, 0) = nSubAuthority0; if (nSubAuthorityCount > 1) *GetSidSubAuthority(*pSid, 1) = nSubAuthority1; if (nSubAuthorityCount > 2) *GetSidSubAuthority(*pSid, 2) = nSubAuthority2; if (nSubAuthorityCount > 3) *GetSidSubAuthority(*pSid, 3) = nSubAuthority3; if (nSubAuthorityCount > 4) *GetSidSubAuthority(*pSid, 4) = nSubAuthority4; if (nSubAuthorityCount > 5) *GetSidSubAuthority(*pSid, 5) = nSubAuthority5; if (nSubAuthorityCount > 6) *GetSidSubAuthority(*pSid, 6) = nSubAuthority6; if (nSubAuthorityCount > 7) *GetSidSubAuthority(*pSid, 7) = nSubAuthority7; return TRUE; } /*********************************************************************** * FreeSid (ADVAPI.42) */ VOID* WINAPI FreeSid(LPSID pSid) { free(pSid); return NULL; } /*********************************************************************** * InitializeSid (ADVAPI.74) */ BOOL32 WINAPI InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount) { int i; pSid->Revision = SID_REVISION; if (pIdentifierAuthority) memcpy(&pSid->IdentifierAuthority, pIdentifierAuthority, sizeof (SID_IDENTIFIER_AUTHORITY)); *GetSidSubAuthorityCount(pSid) = nSubAuthorityCount; for (i = 0; i < nSubAuthorityCount; i++) *GetSidSubAuthority(pSid, i) = 0; return TRUE; } /*********************************************************************** * GetSidIdentifierAuthority (ADVAPI.62) */ LPSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority (LPSID pSid) { return &pSid->IdentifierAuthority; } /*********************************************************************** * GetSidSubAuthority (ADVAPI.64) */ DWORD * WINAPI GetSidSubAuthority (LPSID pSid, DWORD nSubAuthority) { return &pSid->SubAuthority[nSubAuthority]; } /*********************************************************************** * GetSidSubAuthorityCount (ADVAPI.65) */ BYTE * WINAPI GetSidSubAuthorityCount (LPSID pSid) { return &pSid->SubAuthorityCount; } /*********************************************************************** * GetLengthSid (ADVAPI.48) */ DWORD WINAPI GetLengthSid (LPSID pSid) { return GetSidLengthRequired(*GetSidSubAuthorityCount(pSid)); } /*********************************************************************** * CopySid (ADVAPI.24) */ BOOL32 WINAPI CopySid (DWORD nDestinationSidLength, LPSID pDestinationSid, LPSID pSourceSid) { if (!IsValidSid(pSourceSid)) return FALSE; if (nDestinationSidLength < GetLengthSid(pSourceSid)) return FALSE; memcpy(pDestinationSid, pSourceSid, GetLengthSid(pSourceSid)); return TRUE; }