250 lines
6.4 KiB
C
250 lines
6.4 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
tlookup.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Test for a leak in LsaLookupName().
|
|||
|
|
|||
|
|
|||
|
nmake UMTYPE=console UMTEST=tlookup
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Kelly (JimK) Mar-31-1994
|
|||
|
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Includes //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
#include <nt.h>
|
|||
|
#include <ntlsa.h>
|
|||
|
#include <ntrtl.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Global Variables //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
ULONG
|
|||
|
TLsapLoopLimit = 1000;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Local routine definitions //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Routines //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
VOID __cdecl
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NtStatus,
|
|||
|
LookupSidStatus = STATUS_SUCCESS;
|
|||
|
|
|||
|
ULONG
|
|||
|
i;
|
|||
|
|
|||
|
LSA_HANDLE
|
|||
|
PolicyHandle;
|
|||
|
|
|||
|
OBJECT_ATTRIBUTES
|
|||
|
ObjectAttributes;
|
|||
|
|
|||
|
UNICODE_STRING
|
|||
|
NameBuffer,
|
|||
|
SystemName;
|
|||
|
|
|||
|
PUNICODE_STRING
|
|||
|
Names;
|
|||
|
|
|||
|
PLSA_REFERENCED_DOMAIN_LIST
|
|||
|
ReferencedDomains;
|
|||
|
|
|||
|
PLSA_TRANSLATED_SID
|
|||
|
Sids;
|
|||
|
|
|||
|
ULONG
|
|||
|
SidLength;
|
|||
|
|
|||
|
PSID
|
|||
|
LookupSid;
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
DoSidTest;
|
|||
|
|
|||
|
PLSA_TRANSLATED_NAME
|
|||
|
TranslatedNames;
|
|||
|
|
|||
|
|
|||
|
Names = &NameBuffer;
|
|||
|
RtlInitUnicodeString( &NameBuffer, L"jimk_dom2\\Jimk_d2_t1" );
|
|||
|
RtlInitUnicodeString( &SystemName, L"" );
|
|||
|
|
|||
|
|
|||
|
printf("\n\nLsaLookupName() and LsaLookupSid() test.\n"
|
|||
|
"This test is good to use when looking for leaks\n"
|
|||
|
"in the lookup paths.\n\n");
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// open the policy object and then loop, looking up names.
|
|||
|
//
|
|||
|
|
|||
|
InitializeObjectAttributes( &ObjectAttributes, NULL, 0L, NULL, NULL );
|
|||
|
NtStatus = LsaOpenPolicy(
|
|||
|
&SystemName,
|
|||
|
&ObjectAttributes,
|
|||
|
POLICY_EXECUTE,
|
|||
|
&PolicyHandle
|
|||
|
);
|
|||
|
|
|||
|
if (NT_SUCCESS(NtStatus)) {
|
|||
|
|
|||
|
//
|
|||
|
// Get a sid to lookup
|
|||
|
//
|
|||
|
|
|||
|
ReferencedDomains = NULL;
|
|||
|
Sids = NULL;
|
|||
|
NtStatus = LsaLookupNames(
|
|||
|
PolicyHandle,
|
|||
|
1, //Count
|
|||
|
Names,
|
|||
|
&ReferencedDomains,
|
|||
|
&Sids
|
|||
|
);
|
|||
|
if (NT_SUCCESS(NtStatus)) {
|
|||
|
|
|||
|
//
|
|||
|
// Build a sid to use in the lookup
|
|||
|
// This is done by copying the ReferencedDomain sid,
|
|||
|
// then adding one more relative ID.
|
|||
|
//
|
|||
|
|
|||
|
ASSERT(ReferencedDomains != NULL);
|
|||
|
ASSERT(Sids != NULL);
|
|||
|
|
|||
|
SidLength =
|
|||
|
sizeof(ULONG) +
|
|||
|
RtlLengthSid( &ReferencedDomains->Domains[Sids[0].DomainIndex].Sid );
|
|||
|
|
|||
|
LookupSid = RtlAllocateHeap( RtlProcessHeap(), 0, SidLength );
|
|||
|
ASSERT(LookupSid != NULL);
|
|||
|
|
|||
|
RtlCopySid( SidLength,
|
|||
|
LookupSid,
|
|||
|
ReferencedDomains->Domains[Sids[0].DomainIndex].Sid );
|
|||
|
(*RtlSubAuthoritySid(
|
|||
|
LookupSid,
|
|||
|
(ULONG)(*RtlSubAuthorityCountSid(LookupSid))
|
|||
|
)) = Sids[0].RelativeId;
|
|||
|
(*RtlSubAuthorityCountSid(LookupSid)) += 1;
|
|||
|
|
|||
|
DoSidTest = TRUE;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
printf("ERROR: Couldn't get SID value to lookup.\n"
|
|||
|
" Won't perform SID lookup part of test.\n\n");
|
|||
|
DoSidTest = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (ReferencedDomains != NULL) {
|
|||
|
LsaFreeMemory( ReferencedDomains );
|
|||
|
}
|
|||
|
if (Sids != NULL) {
|
|||
|
LsaFreeMemory( Sids );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
printf("\nLooping %d times...\n", TLsapLoopLimit);
|
|||
|
for (i=0; i<TLsapLoopLimit; i++) {
|
|||
|
|
|||
|
printf("\r Loop Count %#4d LookupName Status: 0x%08lx LookupSid Status: 0x%08lx",
|
|||
|
i, NtStatus, LookupSidStatus);
|
|||
|
|
|||
|
//
|
|||
|
// Lookup name
|
|||
|
//
|
|||
|
|
|||
|
ReferencedDomains = NULL;
|
|||
|
Sids = NULL;
|
|||
|
NtStatus = LsaLookupNames(
|
|||
|
PolicyHandle,
|
|||
|
1, //Count
|
|||
|
Names,
|
|||
|
&ReferencedDomains,
|
|||
|
&Sids
|
|||
|
);
|
|||
|
|
|||
|
if (ReferencedDomains != NULL) {
|
|||
|
LsaFreeMemory( ReferencedDomains );
|
|||
|
}
|
|||
|
if (Sids != NULL) {
|
|||
|
LsaFreeMemory( Sids );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Lookup SID
|
|||
|
//
|
|||
|
|
|||
|
if (DoSidTest) {
|
|||
|
ReferencedDomains = NULL;
|
|||
|
Sids = NULL;
|
|||
|
LookupSidStatus = LsaLookupSids(
|
|||
|
PolicyHandle,
|
|||
|
1, //Count
|
|||
|
&LookupSid,
|
|||
|
&ReferencedDomains,
|
|||
|
&TranslatedNames
|
|||
|
);
|
|||
|
|
|||
|
if (ReferencedDomains != NULL) {
|
|||
|
LsaFreeMemory( ReferencedDomains );
|
|||
|
}
|
|||
|
if (TranslatedNames != NULL) {
|
|||
|
LsaFreeMemory( TranslatedNames );
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|