[PATCH] winspool: Extend EnumFormsA/W to read forms from registry

Marcel Partap mpartap at gmx.net
Sat Apr 12 18:38:40 CDT 2008


---
 dlls/winspool.drv/info.c |   55 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 41cf76f..60656bc 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -7411,12 +7411,20 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
                        DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
 {
     opened_printer_t *printer = NULL;
+    form_regentry_t regform;
     PFORM_INFO_1W fiW;
     LPWSTR strptr;
+    WCHAR  formname[CCHFORMNAME+1];
+    HKEY   hformskey = NULL;
     BOOL   res = FALSE;
     DWORD  i;
-    DWORD  num;
+    DWORD  index = 0;
     DWORD  needed = 0;
+    DWORD  numbuiltin;
+    DWORD  numregentries = 0;
+    DWORD  regtype;
+    DWORD  formnamelen = sizeof(formname);
+    DWORD  buffersize = sizeof(regform);
 
     TRACE("(%p %d %p %d %p %p)\n", hPrinter, Level, pForm, cbBuf, pcbNeeded, pcReturned);
 
@@ -7431,11 +7439,23 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
         return FALSE;
     }
 
-    num = sizeof(builtin_forms)/sizeof(builtin_form_t);
-    for (i = 0; i < num; i++) {
+    numbuiltin = sizeof(builtin_forms)/sizeof(builtin_form_t);
+    for (i = 0; i < numbuiltin; i++) {
         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 efw_cleanup;
@@ -7448,9 +7468,9 @@ BOOL WINAPI EnumFormsW(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
         SetLastError(RPC_X_NULL_REF_POINTER);
         goto efw_cleanup;
     }
-    strptr = (LPWSTR)(pForm + num*sizeof(FORM_INFO_1W));
+    strptr = (LPWSTR)(pForm + (numbuiltin+numregentries)*sizeof(FORM_INFO_1W));
     fiW = (PFORM_INFO_1W)pForm;
-    for (i = 0; i < num; i++) {
+    for (i = 0; i < numbuiltin; i++) {
         fiW->pName = lstrcpyW(strptr, builtin_forms[i].formname);
         fiW->Size = builtin_forms[i].formdata.size;
         fiW->ImageableArea = builtin_forms[i].formdata.area;
@@ -7458,13 +7478,34 @@ 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;
 
 efw_cleanup:
     if (pcbNeeded) *pcbNeeded = needed;
-    if (pcReturned && res) *pcReturned = num;
+    if (pcReturned && res) *pcReturned = numbuiltin + numregentries;
+    if (hformskey) RegCloseKey(hformskey);
 
-    TRACE("returning %d with %d (%d Bytes for %d entries)\n", res, GetLastError(), needed, num);
+    TRACE("returning %d with %d (%d Bytes for %d entries)\n", res, GetLastError(), needed, numbuiltin + numregentries);
     return res;
 }
 
-- 
1.5.4.5


--------------020903010902070008060405--



More information about the wine-patches mailing list