[PATCH] winspool: Extend EnumForms to read forms from registry
Marcel Partap
mpartap at gmx.net
Sun Apr 27 14:53:55 CDT 2008
---
dlls/winspool.drv/info.c | 49 ++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index cc0c12e..276b5ae 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -7362,10 +7362,18 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
{
opened_printer_t *printer = NULL;
- PFORM_INFO_1W fiW;
+ form_regentry_t regform;
+ PFORM_INFO_1W fiW;
+ HKEY hformskey = NULL;
LPWSTR strptr;
+ WCHAR formname[CCHFORMNAME+1];
+ DWORD formnamelen = sizeof(formname);
+ DWORD buffersize = sizeof(regform);
DWORD numbuiltin;
+ DWORD numregentries = 0;
+ DWORD regtype;
DWORD i;
+ DWORD index = 0;
DWORD needed = 0;
BOOL res = FALSE;
@@ -7387,6 +7395,18 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
needed += sizeof(FORM_INFO_1W) + (strlenW(builtin_forms[i].formname)+1)*sizeof(WCHAR);
}
+ if (RegCreateKeyW(HKEY_LOCAL_MACHINE, FormsW, &hformskey) == ERROR_SUCCESS) {
+ while (RegEnumValueW(hformskey, index, formname, &formnamelen,
+ NULL, ®type, NULL, NULL) == ERROR_SUCCESS) {
+ if (formname[0]) {
+ numregentries++;
+ needed += sizeof(FORM_INFO_1W) + (strlenW(formname)+1)*sizeof(WCHAR);
+ }
+ index++;
+ formnamelen = sizeof(formname);
+ }
+ }
+
if (cbBuf < needed) {
SetLastError(ERROR_INSUFFICIENT_BUFFER);
goto end_efw;
@@ -7399,8 +7419,10 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
SetLastError(RPC_X_NULL_REF_POINTER);
goto end_efw;
}
- strptr = (LPWSTR)(pForm + numbuiltin*sizeof(FORM_INFO_1W));
+ strptr = (LPWSTR)(pForm + (numbuiltin+numregentries)*sizeof(FORM_INFO_1W));
fiW = (PFORM_INFO_1W)pForm;
+
+ /* spit out builtin forms */
for (i = 0; i < numbuiltin; i++) {
fiW->pName = lstrcpyW(strptr, builtin_forms[i].formname);
fiW->Size = builtin_forms[i].formdata.size;
@@ -7409,13 +7431,32 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
fiW++;
strptr += lstrlenW(builtin_forms[i].formname)+1;
}
+
+ /* read forms from registry */
+ if (hformskey && numregentries > 0) {
+ index = 0;
+ while (RegEnumValueW(hformskey, index, formname, &formnamelen, NULL, ®type,
+ (LPBYTE)®form, &buffersize) == ERROR_SUCCESS) {
+ if (formname[0]) {
+ fiW->pName = lstrcpyW(strptr, formname);
+ fiW->Flags = regform.flags;
+ fiW->Size = regform.size;
+ fiW->ImageableArea = regform.area;
+ fiW++;
+ strptr += lstrlenW(formname)+1;
+ }
+ index++;
+ formnamelen = sizeof(formname);
+ buffersize = sizeof(regform);
+ }
+ }
res = TRUE;
end_efw:
if (pcbNeeded) *pcbNeeded = needed;
- if (pcReturned && res) *pcReturned = numbuiltin;
+ if (pcReturned && res) *pcReturned = numbuiltin + numregentries;
- TRACE("returning %d with %d (%d Bytes for %d entries)\n", res, GetLastError(), needed, numbuiltin);
+ TRACE("returning %d with %d (%d Bytes for %d entries)\n", res, GetLastError(), needed, numbuiltin + numregentries);
return res;
}
--
1.5.5.1
--------------040801040103010701020801--
More information about the wine-patches
mailing list