/*++ 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 #include #include #include #include /////////////////////////////////////////////////////////////////////////////// // // // 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