From 21b311ee916087708a08a684cc7ea26b37eb864f Mon Sep 17 00:00:00 2001 From: Marcel Partap Date: Sun, 27 Apr 2008 21:53:55 +0200 Subject: [PATCH] winspool: Extend EnumForms to read forms from registry --- 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 e67285d..c6e3285 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -7405,10 +7405,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 = 0; + DWORD numregentries = 0; + DWORD regtype; DWORD i; + DWORD index = 0; DWORD needed = 0; BOOL res = FALSE; @@ -7430,6 +7438,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; @@ -7442,8 +7462,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; @@ -7452,13 +7474,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