static BOOL CheckDPA(HDPA dpa, DWORD dwIn, PDWORD pdwOut) { DWORD dwOut = 0; INT i; for(i = 0; i < 8;) { ULONG_PTR ulItem = (ULONG_PTR)pDPA_GetPtr(dpa, i++); if(!ulItem) break; dwOut = dwOut << 4 | (ulItem & 0xf); } *pdwOut = dwOut; if(dwOut != dwIn) { pDPA_DeleteAllPtrs(dpa); do { pDPA_InsertPtr(dpa, 0, (PVOID)(ULONG_PTR)(dwIn & 0xf)); dwIn >>= 4; } while(dwIn); return FALSE; }
/***************************************************************************** * SIC_IconAppend [internal] * * NOTES * appends a icon pair to the end of the cache */ static INT SIC_IconAppend (LPCSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon) { LPSIC_ENTRY lpsice; INT ret, index, index1; char *path; TRACE("%s %i %x %x\n", sSourceFile, dwSourceIndex, hSmallIcon ,hBigIcon); lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY)); path = PathFindFileNameA(sSourceFile); lpsice->sSourceFile = HeapAlloc( GetProcessHeap(), 0, strlen(path)+1 ); strcpy( lpsice->sSourceFile, path ); lpsice->dwSourceIndex = dwSourceIndex; EnterCriticalSection(&SHELL32_SicCS); index = pDPA_InsertPtr(sic_hdpa, 0x7fff, lpsice); if ( INVALID_INDEX == index ) { SHFree(lpsice); ret = INVALID_INDEX; } else { index = ImageList_AddIcon (ShellSmallIconList, hSmallIcon); index1= ImageList_AddIcon (ShellBigIconList, hBigIcon); if (index!=index1) { FIXME("iconlists out of sync 0x%x 0x%x\n", index, index1); } lpsice->dwListIndex = index; ret = lpsice->dwListIndex; } LeaveCriticalSection(&SHELL32_SicCS); return ret; }