2 * Undocumented functions from COMCTL32.DLL
4 * Copyright 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
7 * All of these functions are UNDOCUMENTED!! And I mean UNDOCUMENTED!!!!
8 * Do NOT rely on names or contents of undocumented structures and types!!!
9 * These functions are used by EXPLORER.EXE, IEXPLORE.EXE and
10 * COMCTL32.DLL (internally).
13 * - Fix DSA_InsertItem.
15 * - Write documentation.
26 typedef struct _DSA_DATA
33 } DSA_DATA
, *LPDSA_DATA
;
36 typedef struct _DPA_DATA
42 } DPA_DATA
, *LPDPA_DATA
;
45 DWORD WINAPI
DSA_Create (DWORD
, DWORD
);
48 DWORD WINAPI
DPA_Create (DWORD
);
49 DWORD WINAPI
DPA_GetPtr (DWORD
, DWORD
);
50 DWORD WINAPI
DPA_InsertPtr (DWORD
, DWORD
, DWORD
);
55 /**************************************************************************
61 COMCTL32_Alloc (DWORD dwParam
)
65 lpPtr
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, dwParam
);
67 TRACE (commctrl
, "(0x%08lx) ret=0x%08lx\n", dwParam
, (DWORD
)lpPtr
);
73 /**************************************************************************
74 * ReAlloc [COMCTL32.72]
79 COMCTL32_ReAlloc (LPVOID dwParam1
, DWORD dwParam2
)
84 dwPtr
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
,
87 dwPtr
= HeapReAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
,
90 TRACE (commctrl
, "(0x%08lx 0x%08lx) ret=0x%08lx\n",
91 (DWORD
)dwParam1
, dwParam2
, (DWORD
)dwPtr
);
97 /**************************************************************************
103 COMCTL32_Free (LPVOID dwParam
)
105 TRACE (commctrl
, "(0x%08lx)\n", (DWORD
)dwParam
);
106 HeapFree (GetProcessHeap (), 0, dwParam
);
112 /**************************************************************************
113 * GetSize [COMCTL32.74]
118 COMCTL32_GetSize (LPVOID dwParam
)
120 TRACE (commctrl
, "(0x%08lx)\n", (DWORD
)dwParam
);
121 return (HeapSize (GetProcessHeap (), 0, dwParam
));
126 /**************************************************************************
127 * Str_SetPtrA [COMCTL32.234]
135 COMCTL32_Str_SetPtrA (LPSTR lpStr
, LPVOID
*lpPtr
)
140 FIXME (commctrl
, "(0x%08lx 0x%08lx)\n", (DWORD
)lpStr
, (DWORD
)lpPtr
);
141 FIXME (commctrl
, "(\"%s\" \"%s\")\n", lpStr
, (LPSTR
)*lpPtr
);
144 len
= lstrlen32A (lpStr
);
145 ptr
= COMCTL32_ReAlloc (lpPtr
, len
+ 1);
148 lstrcpy32A (ptr
, lpStr
);
154 COMCTL32_Free (*lpPtr
);
163 /**************************************************************************
164 * DSA_Create [COMCTL32.320] Creates a dynamic string array
172 DSA_Create (DWORD dwParam1
, DWORD dwParam2
)
176 dsaPtr
= (LPDSA_DATA
)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
,
178 dsaPtr
->dwInitial
= dwParam1
;
179 dsaPtr
->dwGrow
= dwParam2
;
181 TRACE (commctrl
, "(0x%08lx 0x%08lx) ret=0x%08lx\n",
182 dwParam1
, dwParam2
, (DWORD
)dsaPtr
);
184 return (DWORD
)dsaPtr
;
188 /**************************************************************************
189 * DSA_Destroy [COMCTL32.321] Destroys a dynamic string array
196 DSA_Destroy (DWORD dwParam1
)
198 LPDSA_DATA dsaPtr
= (LPDSA_DATA
)dwParam1
;
201 TRACE (commctrl
, "(0x%08lx):semi-stub!\n", dwParam1
);
204 for (i
= 0; i
< dsaPtr
->dwEntryCount
; i
++) {
206 HeapFree (GetProcessHeap (), 0, (LPSTR
)dsaPtr
->ptrs
[i
]);
210 HeapFree (GetProcessHeap (), 0, dsaPtr
);
217 DSA_GetItem (DWORD dwParam1
, DWORD dwParam2
, DWORD dwParam3
)
219 LPDSA_DATA dsaPtr
= (LPDSA_DATA
)dwParam1
;
221 FIXME (commctrl
, "(0x%08lx 0x%08lx 0x%08lx): stub!\n",
222 dwParam1
, dwParam2
, dwParam3
);
226 if (dsaPtr
->ptrs
== NULL
)
228 if ((dwParam2
< 0) || (dwParam2
>= dsaPtr
->dwEntryCount
))
231 // FIXME (commctrl, "\"%s\"\n", (LPSTR)dsaPtr->ptrs[dwParam2]);
233 return (DWORD
)lstrcpy32A ((LPSTR
)dwParam3
, (LPSTR
)dsaPtr
->ptrs
[dwParam2
]);
238 DSA_GetItemPtr (DWORD dwParam1
, DWORD dwParam2
)
240 LPDSA_DATA dsaPtr
= (LPDSA_DATA
)dwParam1
;
242 TRACE (commctrl
, "(0x%08lx 0x%08lx)\n", dwParam1
, dwParam2
);
246 if (dsaPtr
->ptrs
== NULL
)
248 if ((dwParam2
< 0) || (dwParam2
>= dsaPtr
->dwEntryCount
))
251 TRACE (commctrl
, "ret=0x%08lx\n", (DWORD
)dsaPtr
->ptrs
[dwParam2
]);
253 return (DWORD
)dsaPtr
->ptrs
[dwParam2
];
258 DSA_InsertItem (DWORD dwParam1
, DWORD dwParam2
, DWORD dwParam3
)
260 LPDSA_DATA dsaPtr
= (LPDSA_DATA
)dwParam1
;
264 TRACE (commctrl
, "(0x%08lx 0x%08lx \"%s\"):semi-stub!\n",
265 dwParam1
, dwParam2
, (LPSTR
)dwParam3
);
267 if (dsaPtr
->ptrs
== NULL
) {
268 dsaPtr
->ptrs
= (LPSTR
*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
,
269 dsaPtr
->dwInitial
* sizeof(LPVOID
));
270 dsaPtr
->dwMaxCount
= dsaPtr
->dwInitial
;
272 len
= lstrlen32A ((LPSTR
)dwParam3
);
273 dsaPtr
->ptrs
[dwIndex
] =
274 (LPSTR
)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, len
+1);
275 lstrcpy32A (dsaPtr
->ptrs
[dwIndex
], (LPSTR
)dwParam3
);
278 TRACE (commctrl
, "(0x%08lx 0x%08lx)\n",
279 dsaPtr
->dwEntryCount
, dsaPtr
->dwMaxCount
);
280 if (dwParam2
>= dsaPtr
->dwEntryCount
) {
281 if (dsaPtr
->dwEntryCount
< dsaPtr
->dwMaxCount
) {
282 dwIndex
= dsaPtr
->dwEntryCount
;
283 len
= lstrlen32A ((LPSTR
)dwParam3
);
284 dsaPtr
->ptrs
[dwIndex
] =
285 (LPSTR
)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, len
+1);
286 lstrcpy32A (dsaPtr
->ptrs
[dwIndex
], (LPSTR
)dwParam3
);
289 /* allocate new pointer list and copy all pointers */
290 LPSTR
*lpOldPtrs
= dsaPtr
->ptrs
;
291 dsaPtr
->ptrs
= (LPSTR
*)HeapAlloc (SystemHeap
, HEAP_ZERO_MEMORY
,
292 (dsaPtr
->dwInitial
+ dsaPtr
->dwGrow
) *
294 memcpy (dsaPtr
->ptrs
, lpOldPtrs
,
295 dsaPtr
->dwMaxCount
* sizeof(LPVOID
));
296 dsaPtr
->dwMaxCount
+= dsaPtr
->dwGrow
;
297 HeapFree (GetProcessHeap (), 0, lpOldPtrs
);
300 dwIndex
= dsaPtr
->dwEntryCount
;
301 len
= lstrlen32A ((LPSTR
)dwParam3
);
302 dsaPtr
->ptrs
[dwIndex
] =
303 (LPSTR
)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, len
+1);
304 lstrcpy32A (dsaPtr
->ptrs
[dwIndex
], (LPSTR
)dwParam3
);
308 FIXME (commctrl
, "inserting! stub!\n");
314 dsaPtr
->dwEntryCount
++;
316 TRACE (commctrl
, "ret=0x%08lx\n", dwIndex
);
325 DSA_DeleteItem (DWORD dwParam1
, DWORD dwParam2
)
327 LPDSA_DATA dsaPtr
= (LPDSA_DATA
)dwParam1
;
329 TRACE (commctrl
, "(0x%08lx 0x%08lx):semi-stub!\n",
333 if (dsaPtr
->dwEntryCount
== 1) {
334 if (dsaPtr
->ptrs
[dwParam2
])
335 HeapFree (GetProcessHeap (), 0, dsaPtr
->ptrs
[dwParam2
]);
336 dsaPtr
->dwEntryCount
--;
339 LPSTR
*oldPtrs
= dsaPtr
->ptrs
;
340 TRACE (commctrl
, "complex delete!\n");
342 if (dsaPtr
->ptrs
[dwParam2
])
343 HeapFree (GetProcessHeap (), 0, dsaPtr
->ptrs
[dwParam2
]);
345 dsaPtr
->dwEntryCount
--;
347 (LPSTR
*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
,
348 dsaPtr
->dwEntryCount
* sizeof(LPVOID
));
350 memcpy (&dsaPtr
->ptrs
[0], &oldPtrs
[0],
351 dwParam2
* sizeof(LPSTR
));
354 if (dwParam2
< dsaPtr
->dwEntryCount
) {
355 memcpy (&dsaPtr
->ptrs
[dwParam2
], &oldPtrs
[dwParam2
+1],
356 (dsaPtr
->dwEntryCount
- dwParam2
) * sizeof(LPSTR
));
358 HeapFree (GetProcessHeap (), 0, oldPtrs
);
361 if (dsaPtr
->dwEntryCount
== 0) {
362 HeapFree (GetProcessHeap (), 0, dsaPtr
->ptrs
);
375 DPA_Create (DWORD dwParam1
)
379 TRACE (commctrl
, "(0x%08lx)\n", dwParam1
);
381 dpaPtr
= (LPDPA_DATA
)HeapAlloc (SystemHeap
, HEAP_ZERO_MEMORY
, sizeof(DPA_DATA
));
382 dpaPtr
->dwGrow
= dwParam1
;
384 TRACE (commctrl
, "ret=0x%08lx\n", (DWORD
)dpaPtr
);
386 return (DWORD
)dpaPtr
;
392 DPA_GetPtr (DWORD dwParam1
, DWORD dwParam2
)
394 LPDPA_DATA dpaPtr
= (LPDPA_DATA
)dwParam1
;
396 TRACE (commctrl
, "(0x%08lx 0x%08lx)\n", dwParam1
, dwParam2
);
400 if (dpaPtr
->ptrs
== NULL
)
402 if ((dwParam2
< 0) || (dwParam2
>= dpaPtr
->dwEntryCount
))
405 TRACE (commctrl
, "ret=0x%08lx\n", (DWORD
)dpaPtr
->ptrs
[dwParam2
]);
407 return (DWORD
)dpaPtr
->ptrs
[dwParam2
];
413 DPA_InsertPtr (DWORD dwParam1
, DWORD dwParam2
, DWORD dwParam3
)
415 LPDPA_DATA dpaPtr
= (LPDPA_DATA
)dwParam1
;
418 TRACE (commctrl
, "(0x%08lx 0x%08lx 0x%lx)\n",
419 dwParam1
, dwParam2
, dwParam3
);
421 if (dpaPtr
->ptrs
== NULL
) {
422 dpaPtr
->ptrs
= (LPDWORD
)HeapAlloc (SystemHeap
, HEAP_ZERO_MEMORY
,
423 dpaPtr
->dwGrow
* sizeof(LPVOID
));
424 dpaPtr
->dwMaxCount
= dpaPtr
->dwGrow
;
426 dpaPtr
->ptrs
[dwIndex
] = dwParam3
;
429 FIXME (commctrl
, "adding to existing array! stub!\n");
435 dpaPtr
->dwEntryCount
++;
441 /**************************************************************************
442 * DPA_CreateEx [COMCTL32.340]
447 DPA_CreateEx (DWORD dwParam1
, DWORD dwParam2
)
449 FIXME (commctrl
, "(0x%08lx 0x%08lx)\n",
456 /**************************************************************************
457 * SendNotify [COMCTL32.341]
462 COMCTL32_SendNotify (DWORD dw1
, DWORD dw2
, DWORD dw3
, DWORD dw4
)
464 FIXME (commctrl
, "(0x%08lx 0x%08lx 0x%08lx 0x%08lx)\n",
472 /**************************************************************************
473 * StrChrA [COMCTL32.350]
478 COMCTL32_StrChrA (LPCSTR lpString
, CHAR cChar
)
480 return strchr (lpString
, cChar
);
484 /**************************************************************************
485 * StrStrIA [COMCTL32.355]
489 COMCTL32_StrStrIA (LPCSTR lpStr1
, LPCSTR lpStr2
)
495 return ((LPSTR
)lpStr1
);
497 while (lpStr1
[len1
] != 0) ++len1
;
499 while (lpStr2
[len2
] != 0) ++len2
;
501 return ((LPSTR
)(lpStr1
+ len1
));
502 first
= tolower (*lpStr2
);
503 while (len1
>= len2
) {
504 if (tolower(*lpStr1
) == first
) {
505 for (i
= 1; i
< len2
; ++i
)
506 if (tolower (lpStr1
[i
]) != tolower(lpStr2
[i
]))
509 return ((LPSTR
)lpStr1
);
517 /**************************************************************************
518 * StrToIntA [COMCTL32.357] Converts a string to a signed integer.
522 COMCTL32_StrToIntA (LPSTR lpString
)
524 return atoi(lpString
);