Detlef Riekenberg : winspool: Use the backend for EnumMonitors.
Alexandre Julliard
julliard at winehq.org
Wed Jul 2 06:03:43 CDT 2008
Module: wine
Branch: master
Commit: 0848be6a60c80a299b31687cee94fbbe3dc82ab2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0848be6a60c80a299b31687cee94fbbe3dc82ab2
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Mon Jun 30 21:54:57 2008 +0200
winspool: Use the backend for EnumMonitors.
---
dlls/winspool.drv/info.c | 139 +--------------------------------------------
1 files changed, 4 insertions(+), 135 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index b49dd53..b7b290f 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -762,98 +762,6 @@ static inline DWORD set_reg_szW(HKEY hkey, const WCHAR *keyname, const WCHAR *va
return ERROR_FILE_NOT_FOUND;
}
-/*****************************************************************************
- * enumerate the local monitors (INTERNAL)
- *
- * returns the needed size (in bytes) for pMonitors
- * and *lpreturned is set to number of entries returned in pMonitors
- *
- */
-static DWORD get_local_monitors(DWORD level, LPBYTE pMonitors, DWORD cbBuf, LPDWORD lpreturned)
-{
- HKEY hroot = NULL;
- HKEY hentry = NULL;
- LPWSTR ptr;
- LPMONITOR_INFO_2W mi;
- WCHAR buffer[MAX_PATH];
- WCHAR dllname[MAX_PATH];
- DWORD dllsize;
- DWORD len;
- DWORD index = 0;
- DWORD needed = 0;
- DWORD numentries;
- DWORD entrysize;
-
- entrysize = (level == 1) ? sizeof(MONITOR_INFO_1W) : sizeof(MONITOR_INFO_2W);
-
- numentries = *lpreturned; /* this is 0, when we scan the registry */
- len = entrysize * numentries;
- ptr = (LPWSTR) &pMonitors[len];
-
- numentries = 0;
- len = sizeof(buffer)/sizeof(buffer[0]);
- buffer[0] = '\0';
-
- /* Windows creates the "Monitors"-Key on reboot / start "spooler" */
- if (RegCreateKeyW(HKEY_LOCAL_MACHINE, MonitorsW, &hroot) == ERROR_SUCCESS) {
- /* Scan all Monitor-Registry-Keys */
- while (RegEnumKeyExW(hroot, index, buffer, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
- TRACE("Monitor_%d: %s\n", numentries, debugstr_w(buffer));
- dllsize = sizeof(dllname);
- dllname[0] = '\0';
-
- /* The Monitor must have a Driver-DLL */
- if (RegOpenKeyExW(hroot, buffer, 0, KEY_READ, &hentry) == ERROR_SUCCESS) {
- if (RegQueryValueExW(hentry, DriverW, NULL, NULL, (LPBYTE) dllname, &dllsize) == ERROR_SUCCESS) {
- /* We found a valid DLL for this Monitor. */
- TRACE("using Driver: %s\n", debugstr_w(dllname));
- }
- RegCloseKey(hentry);
- }
-
- /* Windows returns only Port-Monitors here, but to simplify our code,
- we do no filtering for Language-Monitors */
- if (dllname[0]) {
- numentries++;
- needed += entrysize;
- needed += (len+1) * sizeof(WCHAR); /* len is lstrlenW(monitorname) */
- if (level > 1) {
- /* we install and return only monitors for "Windows NT x86" */
- needed += (lstrlenW(envname_x86W) +1) * sizeof(WCHAR);
- needed += dllsize;
- }
-
- /* required size is calculated. Now fill the user-buffer */
- if (pMonitors && (cbBuf >= needed)){
- mi = (LPMONITOR_INFO_2W) pMonitors;
- pMonitors += entrysize;
-
- TRACE("%p: writing MONITOR_INFO_%dW #%d\n", mi, level, numentries);
- mi->pName = ptr;
- lstrcpyW(ptr, buffer); /* Name of the Monitor */
- ptr += (len+1); /* len is lstrlenW(monitorname) */
- if (level > 1) {
- mi->pEnvironment = ptr;
- lstrcpyW(ptr, envname_x86W); /* fixed to "Windows NT x86" */
- ptr += (lstrlenW(envname_x86W)+1);
-
- mi->pDLLName = ptr;
- lstrcpyW(ptr, dllname); /* Name of the Driver-DLL */
- ptr += (dllsize / sizeof(WCHAR));
- }
- }
- }
- index++;
- len = sizeof(buffer)/sizeof(buffer[0]);
- buffer[0] = '\0';
- }
- RegCloseKey(hroot);
- }
- *lpreturned = numentries;
- TRACE("need %d byte for %d entries\n", needed, numentries);
- return needed;
-}
-
/******************************************************************
* monitor_unload [internal]
*
@@ -7328,67 +7236,28 @@ emA_cleanup:
* Success: TRUE
* Failure: FALSE and in pcbNeeded the Bytes required for buffer, if cbBuf is too small
*
- * NOTES
- * Windows reads the Registry once and cache the Results.
- *
- *| Language-Monitors are also installed in the same Registry-Location but
- *| they are filtered in Windows (not returned by EnumMonitors).
- *| We do no filtering to simplify our Code.
- *
*/
BOOL WINAPI EnumMonitorsW(LPWSTR pName, DWORD Level, LPBYTE pMonitors,
DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
{
- DWORD needed = 0;
- DWORD numentries = 0;
- BOOL res = FALSE;
TRACE("(%s, %d, %p, %d, %p, %p)\n", debugstr_w(pName), Level, pMonitors,
cbBuf, pcbNeeded, pcReturned);
- if (pName && (lstrlenW(pName))) {
- FIXME("for Server %s not implemented\n", debugstr_w(pName));
- SetLastError(ERROR_ACCESS_DENIED);
- goto emW_cleanup;
- }
+ if ((backend == NULL) && !load_backend()) return FALSE;
/* Level is not checked in win9x */
if (!Level || (Level > 2)) {
WARN("level (%d) is ignored in win9x\n", Level);
SetLastError(ERROR_INVALID_LEVEL);
- goto emW_cleanup;
+ return FALSE;
}
if (!pcbNeeded) {
SetLastError(RPC_X_NULL_REF_POINTER);
- goto emW_cleanup;
- }
-
- /* Scan all Monitor-Keys */
- numentries = 0;
- needed = get_local_monitors(Level, NULL, 0, &numentries);
-
- /* we calculated the needed buffersize. now do the error-checks */
- if (cbBuf < needed) {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto emW_cleanup;
- }
- else if (!pMonitors || !pcReturned) {
- SetLastError(RPC_X_NULL_REF_POINTER);
- goto emW_cleanup;
+ return FALSE;
}
- /* fill the Buffer with the Monitor-Keys */
- needed = get_local_monitors(Level, pMonitors, cbBuf, &numentries);
- res = TRUE;
-
-emW_cleanup:
- if (pcbNeeded) *pcbNeeded = needed;
- if (pcReturned) *pcReturned = numentries;
-
- TRACE("returning %d with %d (%d byte for %d entries)\n",
- res, GetLastError(), needed, numentries);
-
- return (res);
+ return backend->fpEnumMonitors(pName, Level, pMonitors, cbBuf, pcbNeeded, pcReturned);
}
/******************************************************************************
More information about the wine-cvs
mailing list