windows-nt/Source/XPSP1/NT/base/win32/client/tse.c
2020-09-26 16:20:57 +08:00

1628 lines
46 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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);
}