[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, ®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 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, ®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;
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