#include "pch.h" #pragma hdrstop /*----------------------------------------------------------------------------- / Misc data /----------------------------------------------------------------------------*/ // // mapping of class to resource ID's // typedef struct { LPCWSTR pObjectClass; INT iResource; } CLASSTORESOURCE, * LPCLASSTORESOURCE; CLASSTORESOURCE normalIcons[] = { L"builtInDomain", IDI_BUILTINDOMAIN, L"computer", IDI_COMPUTER, L"configuration", IDI_CONFIGURATION, L"rpcContainer", IDI_CONFIGURATION, L"contact", IDI_CONTACT, L"container", IDI_CONTAINER, L"domainDNS", IDI_DOMAINDNS, L"domainPolicy", IDI_DOMAINPOLICY, L"group", IDI_GROUP, L"localGroup", IDI_GROUP, L"localPolicy", IDI_LOCALPOLICY, L"nTDSConnection", IDI_NTDSCONNECTION, L"nTDSDSA", IDI_NTDSDSA, L"nTDSSettings", IDI_NTDSSETTINGS, L"organizationalPerson", IDI_ORGANIZATIONALPERSON, L"organizationalUnit", IDI_ORGANIZATIONALUNIT, L"person", IDI_PERSON, L"printQueue", IDI_PRINTQUEUE, L"remoteMailRecipient", IDI_REMOTEMAILRECIPIENT, L"server", IDI_SERVER, L"serverConnection", IDI_SERVERCONNECTION, L"site", IDI_SITE, L"sitesContainer", IDI_SITESCONTAINER, L"storage", IDI_STORAGE, L"subnet", IDI_SUBNET, L"subnetContainer", IDI_CONTAINER, L"user", IDI_USER, L"volume", IDI_VOLUME, L"workStationAccount", IDI_WORKSTATIONACCOUNT, // added daviddv (05jun98) for jonn L"licensingSiteSettings", IDI_LICENSING, L"nTDSSiteSettings", IDI_NTDSSITESETTINGS, L"siteLink", IDI_SITELINK, L"siteLinkBridge", IDI_SITELINK, // added daviddv (19jun98) for jonn L"nTFRSSettings", IDI_NTFRS, L"nTFRSReplicaSet", IDI_NTFRS, L"nTFRSSubscriptions", IDI_NTFRS, L"nTFRSSubscriber", IDI_NTFRS, L"nTFRSMember", IDI_NTFRS, // added daviddv (23jun98) for ericb L"foreignSecurityPrincipal", IDI_FPO, // added daviddv (29oct98) for jonn L"interSiteTransport", IDI_CONTAINER, L"interSiteTransportContainer", IDI_CONTAINER, L"serversContainer", IDI_CONTAINER, // added jeffjon (30nov2000) for jccannon L"inetOrgPerson", IDI_USER, NULL, NULL, }; CLASSTORESOURCE openIcons[] = { L"container", IDI_CONTAINER_OPEN, L"subnetContainer", IDI_CONTAINER_OPEN, L"interSiteTransport", IDI_CONTAINER_OPEN, L"interSiteTransportContainer", IDI_CONTAINER_OPEN, L"serversContainer", IDI_CONTAINER_OPEN, NULL, NULL, }; CLASSTORESOURCE disabledIcons[] = { L"user", IDI_USER_DISABLED, L"computer", IDI_COMPUTER_DISABLED, // added jeffjon (15dec2000) for jccannon L"inetOrgPerson", IDI_USER_DISABLED, NULL, NULL, }; // // mapping of states to icon tables // LPCLASSTORESOURCE state_to_icons[] = { normalIcons, // DSGIF_ISNORMAL openIcons, // DSGIF_ISOPEN disabledIcons, // DSGIF_ISDISABLED }; // // Look up a locally stored icon given its class and state. // BOOL _GetIconForState(LPWSTR pObjectClass, INT iState, INT* pindex) { BOOL fFound = FALSE; INT i; USES_CONVERSION; TraceEnter(TRACE_ICON, "_GetIconForState"); Trace(TEXT("Find icon for class: %s, state: %d"), W2T(pObjectClass), iState); if ( iState < ARRAYSIZE(state_to_icons) ) { LPCLASSTORESOURCE pTable = state_to_icons[iState]; for ( i = 0 ; !fFound && pTable[i].pObjectClass ; i++ ) { if ( !StrCmpIW(pTable[i].pObjectClass, pObjectClass) ) { Trace(TEXT("Found icon at index %d"), i); *pindex = -pTable[i].iResource; fFound = TRUE; } } } TraceLeaveValue(fFound); } /*----------------------------------------------------------------------------- / _GetIconLocation / ---------------- / Given a cache record for the icon, attempt to fetch the icon location from / it. / / In: / pCacheEntry -> locked cacherecord / dwFlags = flags indicating which icon is required / pBuffer -> buffer that receives the name / cchBuffer = maximum size of the name buffer / piIndex = receives the resource ID of the loaded resource / / Out: / HRESULT /----------------------------------------------------------------------------*/ HRESULT _GetModuleLocation(LPWSTR pBuffer, INT cchBuffer) { HRESULT hr = S_OK; TraceEnter(TRACE_ICON,"_GetModuleLocation"); #if UNICODE if ( !GetModuleFileName(GLOBAL_HINSTANCE, pBuffer, cchBuffer) ) ExitGracefully(hr, E_FAIL, "Failed to get module location"); #else TCHAR szBuffer[MAX_PATH]; if ( !GetModuleFileName(GLOBAL_HINSTANCE, szBuffer, ARRAYSIZE(szBuffer)) ) ExitGracefully(hr, E_FAIL, "Failed to get module location"); MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, pBuffer, cchBuffer); #endif exit_gracefully: TraceLeaveResult(hr); } HRESULT _GetIconLocation(LPCLASSCACHEENTRY pCacheEntry, DWORD dwFlags, LPWSTR pBuffer, INT cchBuffer, INT* piIndex) { HRESULT hr; INT iState = dwFlags & DSGIF_ISMASK; USES_CONVERSION; TraceEnter(TRACE_ICON, "_GetIconLocation"); if ( !pBuffer || !piIndex || (iState >= ARRAYSIZE(pCacheEntry->pIconName)) ) ExitGracefully(hr, E_INVALIDARG, "No class, buffer or index pointer specified") // before we get too involved in looking at the cache records lets see if we have // one already, if not then bail out now. if ( !pCacheEntry ) ExitGracefully(hr, S_FALSE, "No cache record, returning S_FALSE"); // look up the class in the cache, if that works try and get the icon string // for the given index, if that yeilds a NULL then try normal. Once we // have a string pointer then lets copy that and parse out the resource ID. if ( (pCacheEntry->dwCached & CLASSCACHE_ICONS) && (pCacheEntry->pIconName[iState] || pCacheEntry->pIconName[DSGIF_ISNORMAL]) ) { TraceMsg("Reading icon name from the display specifier strings"); if ( !pCacheEntry->pIconName[iState] ) iState = DSGIF_ISNORMAL; StrCpyNW(pBuffer, pCacheEntry->pIconName[iState], cchBuffer); *piIndex = PathParseIconLocationW(pBuffer); } else { TraceMsg("Attempting to find icon in our fixed resource table"); if ( _GetIconForState(pCacheEntry->pObjectClass, iState, piIndex) || _GetIconForState(pCacheEntry->pObjectClass, DSGIF_ISNORMAL, piIndex) ) { hr = _GetModuleLocation(pBuffer, cchBuffer); FailGracefully(hr, "Failed to get the module location for dsuiext"); } else { ExitGracefully(hr, S_FALSE, "Failed to find icon bound resources"); } } Trace(TEXT("Location: %s, Index: %d"), W2T(pBuffer), *piIndex); hr = S_OK; exit_gracefully: // // if we failed to look up the icon location, and the caller requested the // default document icon then lets return the shell def document image // if ( (hr == S_FALSE) ) { if ( dwFlags & DSGIF_DEFAULTISCONTAINER ) { hr = E_FAIL; if ( _GetIconForState(L"container", iState, piIndex) || _GetIconForState(L"container", DSGIF_ISNORMAL, piIndex) ) { hr = _GetModuleLocation(pBuffer, cchBuffer); } else if ( dwFlags & DSGIF_GETDEFAULTICON ) { StrCpyNW(pBuffer, L"shell32.dll", cchBuffer); *piIndex = -1; } if ( FAILED(hr) ) { dwFlags &= ~DSGIF_DEFAULTISCONTAINER; ExitGracefully(hr, S_FALSE, "Failed to look up icon as container"); } } hr = S_OK; // its OK, we have a location now. } TraceLeaveResult(hr); }