|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
tse.c
Abstract:
This module tests windows security api.
Author:
Robert Reichel (RobertRe) 01-Jan-92
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <string.h>
#include <stdarg.h>
#include <assert.h>
#include <stdio.h>
#define _TST_USER_ // User mode test
#define BUFFER_SIZE 256
////////////////////////////////////////////////////////////////////////
// //
// Global Variables //
// //
////////////////////////////////////////////////////////////////////////
LUID SystemAuthenticationId = SYSTEM_LUID;
//
// Universal well known SIDs
//
PSID NullSid; PSID WorldSid; PSID LocalSid; PSID CreatorOwnerSid;
//
// Sids defined by NT
//
PSID NtAuthoritySid;
PSID DialupSid; PSID NetworkSid; PSID BatchSid; PSID InteractiveSid; PSID LocalSystemSid;
//
// Well known privilege values
//
LUID SeCreateTokenPrivilege; LUID SeAssignPrimaryTokenPrivilege; LUID SeLockMemoryPrivilege; LUID SeIncreaseQuotaPrivilege; LUID SeUnsolicitedInputPrivilege; LUID SeTcbPrivilege; LUID SeSecurityPrivilege; LUID SeTakeOwnershipPrivilege; LUID SeLoadDriverPrivilege; LUID SeCreatePagefilePrivilege; LUID SeIncreaseBasePriorityPrivilege; LUID SeSystemProfilePrivilege; LUID SeSystemtimePrivilege; LUID SeProfileSingleProcessPrivilege; LUID SeCreatePermanentPrivilege; LUID SeBackupPrivilege; LUID SeRestorePrivilege; LUID SeShutdownPrivilege; LUID SeDebugPrivilege; LUID SeAuditPrivilege; LUID SeSystemEnvironmentPrivilege; LUID SeChangeNotifyPrivilege; LUID SeRemoteShutdownPrivilege;
////////////////////////////////////////////////////////////////////////
// //
// Internal Prototypes //
// //
////////////////////////////////////////////////////////////////////////
VOID TestLookupSid();
VOID TestLookupName();
void TestGetPrivNameW( LPWSTR *PrivName, PLUID lpLuid ); void TestGetPrivNameA( LPSTR *PrivName, PLUID lpLuid );
VOID TestLookupPrivilegeValue();
void TestLookupPrivilegeValueW( PLUID lpLuid );
void TestLookupPrivilegeValueA( PLUID lpLuid );
VOID TestLookupPrivilegeName();
void TestLookupPrivilegeNameW( PLUID lpLuid );
void TestLookupPrivilegeNameA( PLUID lpLuid );
VOID TestLookupPrivilegeDisplayName();
void TestLookupPrivilegeDisplayNameW( PLUID lpLuid );
void TestLookupPrivilegeDisplayNameA( PLUID lpLuid );
void initialize (void);
void TestLookupSidW( IN PSID Sid );
void TestLookupSidA( IN PSID Sid );
void TestLookupNameW( LPWSTR Name );
void DumpWCharString( PWSTR String );
VOID DisplayAccountSid( PSID Sid );
VOID DisplayUse( IN SID_NAME_USE Use );
void initialize (void) {
ULONG SidWithZeroSubAuthorities; ULONG SidWithOneSubAuthority; ULONG SidWithThreeSubAuthorities; ULONG SidWithFourSubAuthorities;
SID_IDENTIFIER_AUTHORITY NullSidAuthority = SECURITY_NULL_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY WorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY LocalSidAuthority = SECURITY_LOCAL_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY CreatorSidAuthority = SECURITY_CREATOR_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
//
// The following SID sizes need to be allocated
//
SidWithZeroSubAuthorities = GetSidLengthRequired( 0 ); SidWithOneSubAuthority = GetSidLengthRequired( 1 ); SidWithThreeSubAuthorities = GetSidLengthRequired( 3 ); SidWithFourSubAuthorities = GetSidLengthRequired( 4 );
//
// Allocate and initialize the universal SIDs
//
NullSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); WorldSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); LocalSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); CreatorOwnerSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority);
InitializeSid( NullSid, &NullSidAuthority, 1 ); InitializeSid( WorldSid, &WorldSidAuthority, 1 ); InitializeSid( LocalSid, &LocalSidAuthority, 1 ); InitializeSid( CreatorOwnerSid, &CreatorSidAuthority, 1 );
*(GetSidSubAuthority( NullSid, 0 )) = SECURITY_NULL_RID; *(GetSidSubAuthority( WorldSid, 0 )) = SECURITY_WORLD_RID; *(GetSidSubAuthority( LocalSid, 0 )) = SECURITY_LOCAL_RID; *(GetSidSubAuthority( CreatorOwnerSid, 0 )) = SECURITY_CREATOR_OWNER_RID;
//
// Allocate and initialize the NT defined SIDs
//
NtAuthoritySid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithZeroSubAuthorities); DialupSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); NetworkSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); BatchSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); InteractiveSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority); LocalSystemSid = (PSID)RtlAllocateHeap( RtlProcessHeap(), 0,SidWithOneSubAuthority);
InitializeSid( NtAuthoritySid, &NtAuthority, 0 ); InitializeSid( DialupSid, &NtAuthority, 1 ); InitializeSid( NetworkSid, &NtAuthority, 1 ); InitializeSid( BatchSid, &NtAuthority, 1 ); InitializeSid( InteractiveSid, &NtAuthority, 1 ); InitializeSid( LocalSystemSid, &NtAuthority, 1 );
*(GetSidSubAuthority( DialupSid, 0 )) = SECURITY_DIALUP_RID; *(GetSidSubAuthority( NetworkSid, 0 )) = SECURITY_NETWORK_RID; *(GetSidSubAuthority( BatchSid, 0 )) = SECURITY_BATCH_RID; *(GetSidSubAuthority( InteractiveSid, 0 )) = SECURITY_INTERACTIVE_RID; *(GetSidSubAuthority( LocalSystemSid, 0 )) = SECURITY_LOCAL_SYSTEM_RID;
//
// Initialize the well known privilege values
//
SeCreateTokenPrivilege = RtlConvertLongToLargeInteger(SE_CREATE_TOKEN_PRIVILEGE); SeAssignPrimaryTokenPrivilege = RtlConvertLongToLargeInteger(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE); SeLockMemoryPrivilege = RtlConvertLongToLargeInteger(SE_LOCK_MEMORY_PRIVILEGE); SeIncreaseQuotaPrivilege = RtlConvertLongToLargeInteger(SE_INCREASE_QUOTA_PRIVILEGE); SeUnsolicitedInputPrivilege = RtlConvertLongToLargeInteger(SE_UNSOLICITED_INPUT_PRIVILEGE); SeTcbPrivilege = RtlConvertLongToLargeInteger(SE_TCB_PRIVILEGE); SeSecurityPrivilege = RtlConvertLongToLargeInteger(SE_SECURITY_PRIVILEGE); SeTakeOwnershipPrivilege = RtlConvertLongToLargeInteger(SE_TAKE_OWNERSHIP_PRIVILEGE); SeLoadDriverPrivilege = RtlConvertLongToLargeInteger(SE_LOAD_DRIVER_PRIVILEGE); SeCreatePagefilePrivilege = RtlConvertLongToLargeInteger(SE_CREATE_PAGEFILE_PRIVILEGE); SeIncreaseBasePriorityPrivilege = RtlConvertLongToLargeInteger(SE_INC_BASE_PRIORITY_PRIVILEGE); SeSystemProfilePrivilege = RtlConvertLongToLargeInteger(SE_SYSTEM_PROFILE_PRIVILEGE); SeSystemtimePrivilege = RtlConvertLongToLargeInteger(SE_SYSTEMTIME_PRIVILEGE); SeProfileSingleProcessPrivilege = RtlConvertLongToLargeInteger(SE_PROF_SINGLE_PROCESS_PRIVILEGE); SeCreatePermanentPrivilege = RtlConvertLongToLargeInteger(SE_CREATE_PERMANENT_PRIVILEGE); SeBackupPrivilege = RtlConvertLongToLargeInteger(SE_BACKUP_PRIVILEGE); SeRestorePrivilege = RtlConvertLongToLargeInteger(SE_RESTORE_PRIVILEGE); SeShutdownPrivilege = RtlConvertLongToLargeInteger(SE_SHUTDOWN_PRIVILEGE); SeDebugPrivilege = RtlConvertLongToLargeInteger(SE_DEBUG_PRIVILEGE); SeAuditPrivilege = RtlConvertLongToLargeInteger(SE_AUDIT_PRIVILEGE); SeSystemEnvironmentPrivilege = RtlConvertLongToLargeInteger(SE_SYSTEM_ENVIRONMENT_PRIVILEGE); SeChangeNotifyPrivilege = RtlConvertLongToLargeInteger(SE_CHANGE_NOTIFY_PRIVILEGE); SeRemoteShutdownPrivilege = RtlConvertLongToLargeInteger(SE_REMOTE_SHUTDOWN_PRIVILEGE);
}
void TestLookupSidW( IN PSID Sid )
{ //
// LookupAccountSidW test
//
BOOL Bool; DWORD cbName = 0; DWORD cbReferencedDomainName = 0; DWORD cbSid = 0; WCHAR Name[BUFFER_SIZE]; SID_NAME_USE peUse = SidTypeUser; WCHAR ReferencedDomainName[BUFFER_SIZE];
printf(" LookupW call . . . . . . . . . . . . . . . . . ");
cbName = 0; cbReferencedDomainName = 0;
Bool = LookupAccountSidW( NULL, Sid, Name, &cbName, ReferencedDomainName, &cbReferencedDomainName, &peUse ); //
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else {
Bool = LookupAccountSidW( NULL, Sid, Name, &cbName, ReferencedDomainName, &cbReferencedDomainName, &peUse );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *"); DumpWCharString( Name ); printf("*\n"); printf(" Domain Name Length: %d\n", cbReferencedDomainName); printf(" Domain Name: *"); DumpWCharString( ReferencedDomainName ); printf("*\n"); printf(" Use: "); DisplayUse( peUse ); printf("\n\n"); } } }
void TestLookupSidA( IN PSID Sid ) { UCHAR Name[BUFFER_SIZE]; UCHAR ReferencedDomainName[BUFFER_SIZE]; BOOL Bool; DWORD cbName = 0; DWORD cbReferencedDomainName = 0; SID_NAME_USE peUse;
printf(" LookupA call . . . . . . . . . . . . . . . . . ");
Bool = LookupAccountSidA( NULL, Sid, Name, &cbName, ReferencedDomainName, &cbReferencedDomainName, &peUse );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else {
Bool = LookupAccountSidA( NULL, Sid, Name, &cbName, ReferencedDomainName, &cbReferencedDomainName, &peUse );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *%s*\n",Name); printf(" Domain Name Length: %d\n", cbReferencedDomainName); printf(" Domain Name: *%s*\n", ReferencedDomainName ); printf(" Use: "); DisplayUse( peUse ); printf("\n\n"); } }
}
void TestLookupNameW( LPWSTR Name )
{
//
// LookupAccountNameW test
//
BOOL Bool; DWORD cbSid = 0; UCHAR Sid[BUFFER_SIZE]; SID_NAME_USE peUse = SidTypeUser; DWORD cbReferencedDomainName = 0; WCHAR ReferencedDomainName[BUFFER_SIZE];
printf(" LookupW call . . . . . . . . . . . . . . . . . ");
Bool = LookupAccountNameW( NULL, Name, Sid, &cbSid, ReferencedDomainName, &cbReferencedDomainName, &peUse );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Sid Length: %d\n", cbSid); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else {
Bool = LookupAccountNameW( NULL, Name, Sid, &cbSid, ReferencedDomainName, &cbReferencedDomainName, &peUse );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Sid Length: %d\n", cbSid); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else { printf("Succeeded\n"); printf(" Sid Length: %d\n", cbSid); printf(" Sid: "); DisplayAccountSid( Sid ); printf("\n"); printf(" Domain Name Length: %d\n", cbReferencedDomainName); printf(" Domain Name: *"); DumpWCharString( ReferencedDomainName ); printf("*\n"); printf(" Use: "); DisplayUse( peUse ); printf("\n\n"); } }
}
void TestLookupNameA( LPSTR Name )
{
//
// LookupAccountNameA test
//
BOOL Bool; DWORD cbSid = 0; UCHAR Sid[BUFFER_SIZE]; SID_NAME_USE peUse = SidTypeUser; DWORD cbReferencedDomainName = 0; UCHAR ReferencedDomainName[BUFFER_SIZE];
printf(" LookupA call . . . . . . . . . . . . . . . . . ");
Bool = LookupAccountNameA( NULL, Name, Sid, &cbSid, ReferencedDomainName, &cbReferencedDomainName, &peUse );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Sid Length: %d\n", cbSid); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else {
Bool = LookupAccountNameA( NULL, Name, Sid, &cbSid, ReferencedDomainName, &cbReferencedDomainName, &peUse );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Sid Length: %d\n", cbSid); printf(" Domain Name Length: %d\n", cbReferencedDomainName); } else { printf("Succeeded\n"); printf(" Sid Length: %d\n", cbSid); printf(" Sid: "); DisplayAccountSid( Sid ); printf("\n"); printf(" Domain Name Length: %d\n", cbReferencedDomainName); printf(" Domain Name: *%s*\n", ReferencedDomainName); printf(" Use: "); DisplayUse( peUse ); printf("\n\n"); } }
}
void TestLookupPrivilegeDisplayNameW( PLUID lpLuid )
{
//
// LookupPrivilegeDisplayNameW test
//
BOOL Bool; DWORD cbName = 0; WCHAR Name[BUFFER_SIZE]; DWORD LanguageId; LPWSTR PrivName;
printf(" LookupW call . . . . . . . . . . . . . . . . . ");
TestGetPrivNameW( &PrivName, lpLuid ); Bool = LookupPrivilegeDisplayNameW( NULL, PrivName, Name, &cbName, &LanguageId );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else {
Bool = LookupPrivilegeDisplayNameW( NULL, PrivName, Name, &cbName, &LanguageId );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *"); DumpWCharString( Name ); printf("*\n"); printf(" LanguageID: %d\n", LanguageId); printf("\n\n"); } }
RtlFreeHeap( RtlProcessHeap(), 0, PrivName ); return; }
void TestLookupPrivilegeDisplayNameA( PLUID lpLuid )
{
//
// LookupPrivilegeDisplayNameA test
//
BOOL Bool; DWORD cbName = 0; UCHAR Name[BUFFER_SIZE]; DWORD LanguageId; LPSTR PrivName;
printf(" LookupA call . . . . . . . . . . . . . . . . . ");
TestGetPrivNameA( &PrivName, lpLuid ); Bool = LookupPrivilegeDisplayNameA( NULL, PrivName, Name, &cbName, &LanguageId );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else {
Bool = LookupPrivilegeDisplayNameA( NULL, PrivName, Name, &cbName, &LanguageId );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *%s*\n", Name); printf(" LanguageID: %d\n", LanguageId); printf("\n\n"); } }
RtlFreeHeap( RtlProcessHeap(), 0, PrivName ); return; }
void TestLookupPrivilegeValueA( PLUID lpLuid )
{
//
// LookupPrivilegeValueA test
//
BOOL Bool; LPSTR PrivName; LUID ReturnedValue;
TestGetPrivNameA( &PrivName, lpLuid );
printf(" LookupA call . . . . . . . . . . . . . . . . . ");
Bool = LookupPrivilegeValueA( NULL, PrivName, &ReturnedValue );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Status: %d\n", GetLastError()); } else {
if (ReturnedValue.LowPart != lpLuid->LowPart || ReturnedValue.HighPart != lpLuid->HighPart) { printf("** FAILED **\n"); printf(" Value mismatch.\n"); printf(" Passed Value: {0x%lx, 0x%lx}\n", lpLuid->HighPart,lpLuid->LowPart); printf(" Retrieved Value: {0x%lx, 0x%lx}\n", ReturnedValue.HighPart,ReturnedValue.LowPart);
} else { printf("Succeeded\n"); } } printf("\n\n");
RtlFreeHeap( RtlProcessHeap(), 0, PrivName ); return; }
void TestLookupPrivilegeValueW( PLUID lpLuid )
{
//
// LookupPrivilegeValueW test
//
BOOL Bool; LPWSTR PrivName; LUID ReturnedValue;
TestGetPrivNameW( &PrivName, lpLuid );
printf(" LookupW call . . . . . . . . . . . . . . . . . ");
Bool = LookupPrivilegeValueW( NULL, PrivName, &ReturnedValue );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Status: %d\n", GetLastError()); } else {
if (ReturnedValue.LowPart != lpLuid->LowPart || ReturnedValue.HighPart != lpLuid->HighPart) { printf("** FAILED **\n"); printf(" Value mismatch.\n"); printf(" Passed Value: {0x%lx, 0x%lx}\n", lpLuid->HighPart,lpLuid->LowPart); printf(" Retrieved Value: {0x%lx, 0x%lx}\n", ReturnedValue.HighPart,ReturnedValue.LowPart);
} else { printf("Succeeded\n"); } }
RtlFreeHeap( RtlProcessHeap(), 0, PrivName ); return; }
void TestGetPrivNameW( LPWSTR *PrivName, PLUID lpLuid ) {
BOOL Bool; DWORD cbName = 0; PWCHAR Name = NULL;
Bool = LookupPrivilegeNameW( NULL, lpLuid, Name, &cbName ); ASSERT( !Bool && GetLastError() == ERROR_INSUFFICIENT_BUFFER );
Name = RtlAllocateHeap( RtlProcessHeap(), 0, (cbName+1)*sizeof(WCHAR) );
Bool = LookupPrivilegeNameW( NULL, lpLuid, Name, &cbName ); ASSERT(Bool);
(*PrivName) = (LPWSTR)Name;
return; }
void TestGetPrivNameA( LPSTR *PrivName, PLUID lpLuid ) {
BOOL Bool; DWORD cbName = 0; PCHAR Name = NULL;
Bool = LookupPrivilegeNameA( NULL, lpLuid, Name, &cbName ); ASSERT( !Bool && GetLastError() == ERROR_INSUFFICIENT_BUFFER );
Name = RtlAllocateHeap( RtlProcessHeap(), 0, (cbName+1)*sizeof(CHAR) );
Bool = LookupPrivilegeNameA( NULL, lpLuid, Name, &cbName ); ASSERT(Bool);
(*PrivName) = (LPSTR)Name;
return; }
void TestLookupPrivilegeNameW( PLUID lpLuid )
{
//
// LookupPrivilegeNameW test
//
BOOL Bool; DWORD cbName = 0; WCHAR Name[BUFFER_SIZE];
printf(" LookupW call . . . . . . . . . . . . . . . . . ");
Bool = LookupPrivilegeNameW( NULL, lpLuid, Name, &cbName );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else {
Bool = LookupPrivilegeNameW( NULL, lpLuid, Name, &cbName );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *"); DumpWCharString( Name ); printf("*\n"); printf("\n\n"); } }
return; }
void TestLookupPrivilegeNameA( PLUID lpLuid )
{
//
// LookupPrivilegeNameA test
//
BOOL Bool; DWORD cbName = 0; UCHAR Name[BUFFER_SIZE];
printf(" LookupA call . . . . . . . . . . . . . . . . . ");
Bool = LookupPrivilegeNameA( NULL, lpLuid, Name, &cbName );
//
// Expect failure here
//
if ( !Bool && GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { printf("** FAILED **\n"); printf(" First call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else {
Bool = LookupPrivilegeNameA( NULL, lpLuid, Name, &cbName );
if ( !Bool ) { printf("** FAILED **\n"); printf(" Second call.\n"); printf(" Status: %d\n", GetLastError()); printf(" Name Length: %d\n", cbName); } else { printf("Succeeded\n"); printf(" Name Length: %d\n", cbName); printf(" Name: *%s*\n", Name); printf("\n\n"); } }
}
VOID DisplayUse( IN SID_NAME_USE Use ) {
switch (Use) { case SidTypeUser: printf("user"); break;
case SidTypeGroup: printf("group"); break;
case SidTypeDomain: printf("domain"); break;
case SidTypeAlias: printf("alias"); break;
case SidTypeWellKnownGroup: printf("well known group"); break;
case SidTypeDeletedAccount: printf("deleted account"); break;
case SidTypeInvalid: printf("invalid to lsa"); break;
case SidTypeUnknown: printf("unknown to lsa"); break;
default: printf("** invalid use value returned **");
}
}
void DumpWCharString( PWSTR String ) { UNICODE_STRING Unicode; ANSI_STRING AnsiString;
RtlInitUnicodeString( &Unicode, String ); // DbgPrint("*%Z*\n",&Unicode);
// DbgPrint(" Length: %d\n", Unicode.Length);
// DbgPrint(" Max: %d\n", Unicode.MaximumLength);
RtlUnicodeStringToAnsiString( &AnsiString, &Unicode, TRUE ); AnsiString.Buffer[AnsiString.Length]=0; // null terminate it
printf("%s", AnsiString.Buffer ); RtlFreeAnsiString( &AnsiString ); return; }
VOID DisplayAccountSid( PSID Sid ) { UCHAR i; ULONG Tmp; PSID_IDENTIFIER_AUTHORITY IdentifierAuthority; UCHAR SubAuthorityCount;
IdentifierAuthority = RtlIdentifierAuthoritySid(Sid);
//
// HACK! HACK!
// The next line prints the revision of the SID. Since there is no
// rtl routine which gives us the SID revision, we must make due.
// luckily, the revision field is the first field in the SID, so we
// can just cast the pointer.
//
printf("S-%u-", (USHORT) *((PUCHAR) Sid) );
if ( (IdentifierAuthority->Value[0] != 0) || (IdentifierAuthority->Value[1] != 0) ){ printf("0x%02hx%02hx%02hx%02hx%02hx%02hx", IdentifierAuthority->Value[0], IdentifierAuthority->Value[1], IdentifierAuthority->Value[2], IdentifierAuthority->Value[3], IdentifierAuthority->Value[4], IdentifierAuthority->Value[5] ); } else { Tmp = IdentifierAuthority->Value[5] + (IdentifierAuthority->Value[4] << 8) + (IdentifierAuthority->Value[3] << 16) + (IdentifierAuthority->Value[2] << 24); printf("%lu", Tmp); }
SubAuthorityCount = *RtlSubAuthorityCountSid(Sid); for (i=0;i<SubAuthorityCount ;i++ ) { printf("-%lu", (*RtlSubAuthoritySid(Sid, i))); } printf("\n"); }
VOID TestLookupSid() {
/////////////////////////////////////////////////////////////////////////
// //
// Sid -> Name test //
// //
/////////////////////////////////////////////////////////////////////////
printf("\n\n\n"); printf(" Sid lookup . . . . . . . . . . . . . . . . . . suite\n");
printf(" Lookup NullSid\n"); TestLookupSidW( NullSid ); TestLookupSidA( NullSid );
printf(" Lookup WorldSid\n"); TestLookupSidW( WorldSid ); TestLookupSidA( WorldSid );
printf(" Lookup LocalSid\n"); TestLookupSidW( LocalSid ); TestLookupSidA( LocalSid );
printf(" Lookup CreatorOwnerSid\n"); TestLookupSidW( CreatorOwnerSid ); TestLookupSidA( CreatorOwnerSid );
printf(" Lookup NtAuthoritySid\n"); TestLookupSidW( NtAuthoritySid ); TestLookupSidA( NtAuthoritySid );
printf(" Lookup DialupSid\n"); TestLookupSidW( DialupSid ); TestLookupSidA( DialupSid );
printf(" Lookup NetworkSid\n"); TestLookupSidW( NetworkSid ); TestLookupSidA( NetworkSid );
printf(" Lookup BatchSid\n"); TestLookupSidW( BatchSid ); TestLookupSidA( BatchSid );
printf(" Lookup InteractiveSid\n"); TestLookupSidW( InteractiveSid ); TestLookupSidA( InteractiveSid );
printf(" Lookup LocalSystemSid\n"); TestLookupSidW( LocalSystemSid ); TestLookupSidA( LocalSystemSid );
printf("\n\n\n"); return; }
VOID TestLookupName() {
/////////////////////////////////////////////////////////////////////////
// //
// Name -> Sid test //
// //
/////////////////////////////////////////////////////////////////////////
printf(" Name Lookup . . . . . . . . . . . . . . . . . suite\n");
printf(" Lookup Null\n"); TestLookupNameW( L"" ); TestLookupNameA( "" );
printf(" Lookup World\n"); TestLookupNameW( L"World" ); TestLookupNameA( "World" );
printf(" Lookup Local\n"); TestLookupNameW( L"Local" ); TestLookupNameA( "Local" );
printf(" Lookup CreatorOwner\n"); TestLookupNameW( L"CreatorOwner" ); TestLookupNameA( "CreatorOwner" );
printf(" Lookup NtAuthority\n"); TestLookupNameW( L"NtAuthority" ); TestLookupNameA( "NtAuthority" );
printf(" Lookup DialupName\n"); TestLookupNameW( L"DialupName" ); TestLookupNameA( "DialupName" );
printf(" Lookup Network\n"); TestLookupNameW( L"Network" ); TestLookupNameA( "Network" );
printf(" Lookup Batch\n"); TestLookupNameW( L"Batch" ); TestLookupNameA( "Batch" );
printf(" Lookup Interactive\n"); TestLookupNameW( L"Interactive" ); TestLookupNameA( "Interactive" );
printf(" Look up LocalSystem\n"); TestLookupNameW( L"LocalSystem" ); TestLookupNameA( "LocalSystem" );
printf("\n\n\n"); return;
}
VOID TestLookupPrivilegeValue() {
/////////////////////////////////////////////////////////////////////////
// //
// LookupPrivilegeValue Tests //
// //
/////////////////////////////////////////////////////////////////////////
printf("\n\n\n"); printf(" Privilege Value Lookup . . . . . . . . . . . . suite\n");
printf(" Lookup SeCreateTokenPrivilege\n"); TestLookupPrivilegeValueW( &SeCreateTokenPrivilege ); TestLookupPrivilegeValueA( &SeCreateTokenPrivilege );
printf(" Lookup SeAssignPrimaryTokenPrivilege\n"); TestLookupPrivilegeValueW( &SeAssignPrimaryTokenPrivilege ); TestLookupPrivilegeValueA( &SeAssignPrimaryTokenPrivilege );
printf(" Lookup SeLockMemoryPrivilege\n"); TestLookupPrivilegeValueW( &SeLockMemoryPrivilege ); TestLookupPrivilegeValueA( &SeLockMemoryPrivilege );
printf(" Lookup SeIncreaseQuotaPrivilege\n"); TestLookupPrivilegeValueW( &SeIncreaseQuotaPrivilege ); TestLookupPrivilegeValueA( &SeIncreaseQuotaPrivilege );
printf(" Lookup SeUnsolicitedInputPrivilege\n"); TestLookupPrivilegeValueW( &SeUnsolicitedInputPrivilege ); TestLookupPrivilegeValueA( &SeUnsolicitedInputPrivilege );
printf(" Lookup SeTcbPrivilege\n"); TestLookupPrivilegeValueW( &SeTcbPrivilege ); TestLookupPrivilegeValueA( &SeTcbPrivilege );
printf(" Lookup SeSecurityPrivilege\n"); TestLookupPrivilegeValueW( &SeSecurityPrivilege ); TestLookupPrivilegeValueA( &SeSecurityPrivilege );
printf(" Lookup SeTakeOwnershipPrivilege\n"); TestLookupPrivilegeValueW( &SeTakeOwnershipPrivilege ); TestLookupPrivilegeValueA( &SeTakeOwnershipPrivilege );
printf(" Lookup SeLoadDriverPrivilege\n"); TestLookupPrivilegeValueW( &SeLoadDriverPrivilege ); TestLookupPrivilegeValueA( &SeLoadDriverPrivilege );
printf(" Lookup SeCreatePagefilePrivilege\n"); TestLookupPrivilegeValueW( &SeCreatePagefilePrivilege ); TestLookupPrivilegeValueA( &SeCreatePagefilePrivilege );
printf(" Lookup SeIncreaseBasePriorityPrivilege\n"); TestLookupPrivilegeValueW( &SeIncreaseBasePriorityPrivilege ); TestLookupPrivilegeValueA( &SeIncreaseBasePriorityPrivilege );
printf(" Lookup SeSystemProfilePrivilege\n"); TestLookupPrivilegeValueW( &SeSystemProfilePrivilege ); TestLookupPrivilegeValueA( &SeSystemProfilePrivilege );
printf(" Lookup SeSystemtimePrivilege\n"); TestLookupPrivilegeValueW( &SeSystemtimePrivilege ); TestLookupPrivilegeValueA( &SeSystemtimePrivilege );
printf(" Lookup SeProfileSingleProcessPrivilege\n"); TestLookupPrivilegeValueW( &SeProfileSingleProcessPrivilege ); TestLookupPrivilegeValueA( &SeProfileSingleProcessPrivilege );
printf(" Lookup SeCreatePermanentPrivilege\n"); TestLookupPrivilegeValueW( &SeCreatePermanentPrivilege ); TestLookupPrivilegeValueA( &SeCreatePermanentPrivilege );
printf(" Lookup SeBackupPrivilege\n"); TestLookupPrivilegeValueW( &SeBackupPrivilege ); TestLookupPrivilegeValueA( &SeBackupPrivilege );
printf(" Lookup SeRestorePrivilege\n"); TestLookupPrivilegeValueW( &SeRestorePrivilege ); TestLookupPrivilegeValueA( &SeRestorePrivilege );
printf(" Lookup SeShutdownPrivilege\n"); TestLookupPrivilegeValueW( &SeShutdownPrivilege ); TestLookupPrivilegeValueA( &SeShutdownPrivilege );
printf(" Lookup SeDebugPrivilege\n"); TestLookupPrivilegeValueW( &SeDebugPrivilege ); TestLookupPrivilegeValueA( &SeDebugPrivilege );
printf(" Lookup SeAuditPrivilege\n"); TestLookupPrivilegeValueW( &SeAuditPrivilege ); TestLookupPrivilegeValueA( &SeAuditPrivilege );
printf(" Lookup SeSystemEnvironmentPrivilege\n"); TestLookupPrivilegeValueW( &SeSystemEnvironmentPrivilege ); TestLookupPrivilegeValueA( &SeSystemEnvironmentPrivilege );
printf(" Lookup SeChangeNotifyPrivilege\n"); TestLookupPrivilegeValueW( &SeChangeNotifyPrivilege ); TestLookupPrivilegeValueA( &SeChangeNotifyPrivilege );
printf(" Lookup SeRemoteShutdownPrivilege\n"); TestLookupPrivilegeValueW( &SeRemoteShutdownPrivilege ); TestLookupPrivilegeValueA( &SeRemoteShutdownPrivilege );
printf("\n\n\n"); return; }
VOID TestLookupPrivilegeName() { /////////////////////////////////////////////////////////////////////////
// //
// LookupPrivilegeName Tests //
// //
/////////////////////////////////////////////////////////////////////////
printf("\n\n\n"); printf(" Privilege Name Lookup . . . . . . . . . . . . suite\n");
printf(" Lookup SeCreateTokenPrivilege\n"); TestLookupPrivilegeNameW( &SeCreateTokenPrivilege ); TestLookupPrivilegeNameA( &SeCreateTokenPrivilege );
printf(" Lookup SeAssignPrimaryTokenPrivilege\n"); TestLookupPrivilegeNameW( &SeAssignPrimaryTokenPrivilege ); TestLookupPrivilegeNameA( &SeAssignPrimaryTokenPrivilege );
printf(" Lookup SeLockMemoryPrivilege\n"); TestLookupPrivilegeNameW( &SeLockMemoryPrivilege ); TestLookupPrivilegeNameA( &SeLockMemoryPrivilege );
printf(" Lookup SeIncreaseQuotaPrivilege\n"); TestLookupPrivilegeNameW( &SeIncreaseQuotaPrivilege ); TestLookupPrivilegeNameA( &SeIncreaseQuotaPrivilege );
printf(" Lookup SeUnsolicitedInputPrivilege\n"); TestLookupPrivilegeNameW( &SeUnsolicitedInputPrivilege ); TestLookupPrivilegeNameA( &SeUnsolicitedInputPrivilege );
printf(" Lookup SeTcbPrivilege\n"); TestLookupPrivilegeNameW( &SeTcbPrivilege ); TestLookupPrivilegeNameA( &SeTcbPrivilege );
printf(" Lookup SeSecurityPrivilege\n"); TestLookupPrivilegeNameW( &SeSecurityPrivilege ); TestLookupPrivilegeNameA( &SeSecurityPrivilege );
printf(" Lookup SeTakeOwnershipPrivilege\n"); TestLookupPrivilegeNameW( &SeTakeOwnershipPrivilege ); TestLookupPrivilegeNameA( &SeTakeOwnershipPrivilege );
printf(" Lookup SeLoadDriverPrivilege\n"); TestLookupPrivilegeNameW( &SeLoadDriverPrivilege ); TestLookupPrivilegeNameA( &SeLoadDriverPrivilege );
printf(" Lookup SeCreatePagefilePrivilege\n"); TestLookupPrivilegeNameW( &SeCreatePagefilePrivilege ); TestLookupPrivilegeNameA( &SeCreatePagefilePrivilege );
printf(" Lookup SeIncreaseBasePriorityPrivilege\n"); TestLookupPrivilegeNameW( &SeIncreaseBasePriorityPrivilege ); TestLookupPrivilegeNameA( &SeIncreaseBasePriorityPrivilege );
printf(" Lookup SeSystemProfilePrivilege\n"); TestLookupPrivilegeNameW( &SeSystemProfilePrivilege ); TestLookupPrivilegeNameA( &SeSystemProfilePrivilege );
printf(" Lookup SeSystemtimePrivilege\n"); TestLookupPrivilegeNameW( &SeSystemtimePrivilege ); TestLookupPrivilegeNameA( &SeSystemtimePrivilege );
printf(" Lookup SeProfileSingleProcessPrivilege\n"); TestLookupPrivilegeNameW( &SeProfileSingleProcessPrivilege ); TestLookupPrivilegeNameA( &SeProfileSingleProcessPrivilege );
printf(" Lookup SeCreatePermanentPrivilege\n"); TestLookupPrivilegeNameW( &SeCreatePermanentPrivilege ); TestLookupPrivilegeNameA( &SeCreatePermanentPrivilege );
printf(" Lookup SeBackupPrivilege\n"); TestLookupPrivilegeNameW( &SeBackupPrivilege ); TestLookupPrivilegeNameA( &SeBackupPrivilege );
printf(" Lookup SeRestorePrivilege\n"); TestLookupPrivilegeNameW( &SeRestorePrivilege ); TestLookupPrivilegeNameA( &SeRestorePrivilege );
printf(" Lookup SeShutdownPrivilege\n"); TestLookupPrivilegeNameW( &SeShutdownPrivilege ); TestLookupPrivilegeNameA( &SeShutdownPrivilege );
printf(" Lookup SeDebugPrivilege\n"); TestLookupPrivilegeNameW( &SeDebugPrivilege ); TestLookupPrivilegeNameA( &SeDebugPrivilege );
printf(" Lookup SeAuditPrivilege\n"); TestLookupPrivilegeNameW( &SeAuditPrivilege ); TestLookupPrivilegeNameA( &SeAuditPrivilege );
printf(" Lookup SeSystemEnvironmentPrivilege\n"); TestLookupPrivilegeNameW( &SeSystemEnvironmentPrivilege ); TestLookupPrivilegeNameA( &SeSystemEnvironmentPrivilege );
printf(" Lookup SeChangeNotifyPrivilege\n"); TestLookupPrivilegeNameW( &SeChangeNotifyPrivilege ); TestLookupPrivilegeNameA( &SeChangeNotifyPrivilege );
printf(" Lookup SeRemoteShutdownPrivilege\n"); TestLookupPrivilegeNameW( &SeRemoteShutdownPrivilege ); TestLookupPrivilegeNameA( &SeRemoteShutdownPrivilege );
printf("\n\n\n"); return; }
VOID TestLookupPrivilegeDisplayName() { /////////////////////////////////////////////////////////////////////////
// //
// LookupPrivilegeDisplayName Tests //
// //
/////////////////////////////////////////////////////////////////////////
printf(" Privilege Display Name Lookup . . . . . . . . suite\n");
printf(" Lookup SeCreateTokenPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeCreateTokenPrivilege ); TestLookupPrivilegeDisplayNameA( &SeCreateTokenPrivilege );
printf(" Lookup SeAssignPrimaryTokenPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeAssignPrimaryTokenPrivilege ); TestLookupPrivilegeDisplayNameA( &SeAssignPrimaryTokenPrivilege );
printf(" Lookup SeLockMemoryPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeLockMemoryPrivilege ); TestLookupPrivilegeDisplayNameA( &SeLockMemoryPrivilege );
printf(" Lookup SeIncreaseQuotaPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeIncreaseQuotaPrivilege ); TestLookupPrivilegeDisplayNameA( &SeIncreaseQuotaPrivilege );
printf(" Lookup SeUnsolicitedInputPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeUnsolicitedInputPrivilege ); TestLookupPrivilegeDisplayNameA( &SeUnsolicitedInputPrivilege );
printf(" Lookup SeTcbPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeTcbPrivilege ); TestLookupPrivilegeDisplayNameA( &SeTcbPrivilege );
printf(" Lookup SeSecurityPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeSecurityPrivilege ); TestLookupPrivilegeDisplayNameA( &SeSecurityPrivilege );
printf(" Lookup SeTakeOwnershipPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeTakeOwnershipPrivilege ); TestLookupPrivilegeDisplayNameA( &SeTakeOwnershipPrivilege );
printf(" Lookup SeLoadDriverPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeLoadDriverPrivilege ); TestLookupPrivilegeDisplayNameA( &SeLoadDriverPrivilege );
printf(" Lookup SeCreatePagefilePrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeCreatePagefilePrivilege ); TestLookupPrivilegeDisplayNameA( &SeCreatePagefilePrivilege );
printf(" Lookup SeIncreaseBasePriorityPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeIncreaseBasePriorityPrivilege ); TestLookupPrivilegeDisplayNameA( &SeIncreaseBasePriorityPrivilege );
printf(" Lookup SeSystemProfilePrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeSystemProfilePrivilege ); TestLookupPrivilegeDisplayNameA( &SeSystemProfilePrivilege );
printf(" Lookup SeSystemtimePrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeSystemtimePrivilege ); TestLookupPrivilegeDisplayNameA( &SeSystemtimePrivilege );
printf(" Lookup SeProfileSingleProcessPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeProfileSingleProcessPrivilege ); TestLookupPrivilegeDisplayNameA( &SeProfileSingleProcessPrivilege );
printf(" Lookup SeCreatePermanentPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeCreatePermanentPrivilege ); TestLookupPrivilegeDisplayNameA( &SeCreatePermanentPrivilege );
printf(" Lookup SeBackupPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeBackupPrivilege ); TestLookupPrivilegeDisplayNameA( &SeBackupPrivilege );
printf(" Lookup SeRestorePrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeRestorePrivilege ); TestLookupPrivilegeDisplayNameA( &SeRestorePrivilege );
printf(" Lookup SeShutdownPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeShutdownPrivilege ); TestLookupPrivilegeDisplayNameA( &SeShutdownPrivilege );
printf(" Lookup SeDebugPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeDebugPrivilege ); TestLookupPrivilegeDisplayNameA( &SeDebugPrivilege );
printf(" Lookup SeAuditPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeAuditPrivilege ); TestLookupPrivilegeDisplayNameA( &SeAuditPrivilege );
printf(" Lookup SeSystemEnvironmentPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeSystemEnvironmentPrivilege ); TestLookupPrivilegeDisplayNameA( &SeSystemEnvironmentPrivilege );
printf(" Lookup SeChangeNotifyPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeChangeNotifyPrivilege ); TestLookupPrivilegeDisplayNameA( &SeChangeNotifyPrivilege );
printf(" Lookup SeRemoteShutdownPrivilege\n"); TestLookupPrivilegeDisplayNameW( &SeRemoteShutdownPrivilege ); TestLookupPrivilegeDisplayNameA( &SeRemoteShutdownPrivilege );
printf("\n\n\n"); return; }
int main (void) {
initialize();
TestLookupSid();
TestLookupName();
TestLookupPrivilegeName();
TestLookupPrivilegeValue();
TestLookupPrivilegeDisplayName();
return(0); }
|