[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, &regtype, 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, &regtype,
+                             (LPBYTE)&regform, &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