|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1996.
//
// File: INIT.C
//
// Contents: DLL Initialization routine
//
// History: 22-Aug-96 MacM Created
//
//----------------------------------------------------------------------------
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <accdbg.h>
#include <lucache.h>
#include <seopaque.h>
HINSTANCE ghDll;
RTL_RESOURCE gWrkrLock; BOOL bWrkrLockInitialized = FALSE;
RTL_RESOURCE gCacheLock; BOOL bCacheLockInitialized = FALSE;
RTL_RESOURCE gLocalSidCacheLock; BOOL bLocalSidCacheLockInitialized = FALSE;
#if DBG
#include <seopaque.h>
#include <sertlp.h>
#define IsObjectAceType(Ace) ( \
(((PACE_HEADER)(Ace))->AceType >= ACCESS_MIN_MS_OBJECT_ACE_TYPE) && \ (((PACE_HEADER)(Ace))->AceType <= ACCESS_MAX_MS_OBJECT_ACE_TYPE) \ )
DEFINE_DEBUG2(ac);
DEBUG_KEY acDebugKeys[] = {{DEB_ERROR, "Error"}, {DEB_WARN, "Warn"}, {DEB_TRACE, "Trace"}, {DEB_TRACE_API, "AccAPI"}, {DEB_TRACE_ACC, "AccList"}, {DEB_TRACE_CACHE, "AccCache"}, {DEB_TRACE_PROP, "AccProp"}, {DEB_TRACE_SD, "AccSD"}, {DEB_TRACE_LOOKUP, "AccLU"}, {DEB_TRACE_MEM, "AccMem"}, {DEB_TRACE_HANDLE, "AccHandle"}, {0, NULL}};
VOID DebugInitialize() { acInitDebug(acDebugKeys); }
VOID DebugUninit() { acUnloadDebug(); }
PVOID DebugAlloc(ULONG cSize) { PVOID pv = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, cSize);
acDebugOut((DEB_TRACE_MEM, "Allocated %lu at 0x%lx\n", cSize, pv ));
return(pv); }
VOID DebugFree(PVOID pv) { if(pv == NULL) { return; } acDebugOut((DEB_TRACE_MEM, "Freeing 0x%lx\n", pv ));
ASSERT(RtlValidateHeap(RtlProcessHeap(),0,NULL));
LocalFree(pv); } #endif // DBG
//+----------------------------------------------------------------------------
//
// Function: DllMain
//
// Synopsis: Initialize state for NTMARTA.DLL
//
// Arguments: [hInstance] -- Module handle
// [dwReason] -- Reason this function is being called
// [lpReserved] -- Reserved
//
// Returns: TRUE -- Success
// FALSE -- Failure
//
//-----------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { BOOL fRet = TRUE; switch(dwReason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hInstance); ghDll = hInstance;
__try { RtlInitializeResource(&gWrkrLock); bWrkrLockInitialized = TRUE; RtlInitializeResource(&gCacheLock); bCacheLockInitialized = TRUE; RtlInitializeResource(&gLocalSidCacheLock); bLocalSidCacheLockInitialized = TRUE; } __except (EXCEPTION_EXECUTE_HANDLER) { fRet = FALSE; }
if (FALSE == fRet) { goto ProcessAttachCleanup; }
#if DBG
DebugInitialize(); #endif
if(AccctrlInitializeSidNameCache() != ERROR_SUCCESS) { fRet = FALSE; goto ProcessAttachCleanup; }
if(AccctrlInitializeIdNameCache() != ERROR_SUCCESS) { fRet = FALSE; goto ProcessAttachCleanup; }
if (AccctrlInitializeRightsCache() != ERROR_SUCCESS) { fRet = FALSE; goto ProcessAttachCleanup; }
return TRUE;
ProcessAttachCleanup:
if (TRUE == bWrkrLockInitialized) { RtlDeleteResource(&gWrkrLock); }
if (TRUE == bCacheLockInitialized) { RtlDeleteResource(&gCacheLock); }
if (TRUE == bLocalSidCacheLockInitialized) { RtlDeleteResource(&gLocalSidCacheLock); }
AccctrlFreeSidNameCache();
AccctrlFreeIdNameCache();
break;
case DLL_PROCESS_DETACH:
#if DBG
DebugUninit(); #endif
if (TRUE == bWrkrLockInitialized) { RtlDeleteResource(&gWrkrLock); }
if (TRUE == bCacheLockInitialized) { RtlDeleteResource(&gCacheLock); }
if (TRUE == bLocalSidCacheLockInitialized) { RtlDeleteResource(&gLocalSidCacheLock); }
AccctrlFreeSidNameCache(); AccctrlFreeIdNameCache(); AccctrlFreeRightsCache();
if(WmiGuidHandle) { CloseHandle(WmiGuidHandle); } break;
default: break;
}
return(fRet);
}
#if DBG
VOID DebugDumpSid(PSTR pszTag, PSID pSid) { if(pSid == NULL) { acDebugOut((DEB_TRACE_SD, "%s NULL\n", pszTag)); } else { UNICODE_STRING SidString; NTSTATUS Status;
Status = RtlConvertSidToUnicodeString(&SidString, pSid, TRUE); if(!NT_SUCCESS(Status)) { acDebugOut((DEB_ERROR, "%s Can't convert sid to string: 0x%lx\n", pszTag, Status)); } else { acDebugOut((DEB_TRACE_SD, "%s %wZ\n", pszTag, &SidString)); RtlFreeUnicodeString(&SidString); } } }
VOID DebugDumpSD(PSTR pszTag, PSECURITY_DESCRIPTOR pSD) { if(pSD == NULL) { acDebugOut((DEB_TRACE_SD,"%s NULL\n", pszTag)); } else { PISECURITY_DESCRIPTOR pISD = (PISECURITY_DESCRIPTOR)pSD;
acDebugOut((DEB_TRACE_SD,"%s: 0x%lx\n", pszTag, pSD)); acDebugOut((DEB_TRACE_SD,"\tRevision: 0x%lx\n",pISD->Revision)); acDebugOut((DEB_TRACE_SD,"\tSbz1: 0x%lx\n", pISD->Sbz1)); acDebugOut((DEB_TRACE_SD,"\tControl: 0x%lx\n",pISD->Control));
DebugDumpSid("\tOwner", RtlpOwnerAddrSecurityDescriptor(pISD)); DebugDumpSid("\tGroup", RtlpGroupAddrSecurityDescriptor(pISD)); DebugDumpAcl("\tDAcl", RtlpDaclAddrSecurityDescriptor(pISD)); DebugDumpAcl("\tSAcl", RtlpSaclAddrSecurityDescriptor(pISD)); } }
VOID DebugDumpAcl(PSTR pszTag, PACL pAcl) { ACL_SIZE_INFORMATION AclSize; ACL_REVISION_INFORMATION AclRev; PKNOWN_ACE pAce; PSID pSid; DWORD iIndex;
if(pAcl == NULL) { acDebugOut((DEB_TRACE_SD,"%s NULL\n", pszTag)); } else { acDebugOut((DEB_TRACE_SD, "%s: 0x%lx\n", pszTag, pAcl));
if(GetAclInformation(pAcl, &AclRev, sizeof(ACL_REVISION_INFORMATION), AclRevisionInformation) == FALSE) { acDebugOut((DEB_TRACE_SD, "GetAclInformation [Revision] failed: %lu\n", GetLastError())); return; }
if(GetAclInformation(pAcl, &AclSize, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation) == FALSE) { acDebugOut((DEB_TRACE_SD, "GetAclInformation [Size] failed: %lu\n", GetLastError())); return; }
acDebugOut((DEB_TRACE_SD, "\t\tRevision: %lu\n", AclRev.AclRevision)); acDebugOut((DEB_TRACE_SD, "\t\tAceCount: %lu\n", AclSize.AceCount)); acDebugOut((DEB_TRACE_SD, "\t\tInUse: %lu\n", AclSize.AclBytesInUse)); acDebugOut((DEB_TRACE_SD, "\t\tFree: %lu\n", AclSize.AclBytesFree)); acDebugOut((DEB_TRACE_SD, "\t\tFlags: %lu\n", pAcl->Sbz1));
//
// Now, dump all of the aces
//
pAce = FirstAce(pAcl); for(iIndex = 0; iIndex < pAcl->AceCount; iIndex++) { acDebugOut((DEB_TRACE_SD,"\t\tAce %lu\n", iIndex));
acDebugOut((DEB_TRACE_SD,"\t\t\tType: %lu\n", pAce->Header.AceType)); acDebugOut((DEB_TRACE_SD,"\t\t\tFlags: 0x%lx\n", pAce->Header.AceFlags)); acDebugOut((DEB_TRACE_SD,"\t\t\tSize: 0x%lx\n", pAce->Header.AceSize)); acDebugOut((DEB_TRACE_SD,"\t\t\tMask: 0x%lx\n", pAce->Mask));
//
// If it's an object ace, dump the guids
//
if(IsObjectAceType(pAce)) { DebugDumpGuid("\t\t\tObjectId", RtlObjectAceObjectType(pAce)); DebugDumpGuid("\t\t\tInheritId", RtlObjectAceInheritedObjectType(pAce)); DebugDumpSid("\t\t\tSid", RtlObjectAceSid(pAce)); } else { DebugDumpSid("\t\t\tSid", ((PSID)&(pAce->SidStart))); }
pAce = NextAce(pAce); } } } #endif
|