ntprint: Implement PSetupCreateMonitorInfo.
diff --git a/dlls/ntprint/Makefile.in b/dlls/ntprint/Makefile.in
index b60b06b..b3ecad8 100644
--- a/dlls/ntprint/Makefile.in
+++ b/dlls/ntprint/Makefile.in
@@ -3,7 +3,7 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = ntprint.dll
-IMPORTS = kernel32
+IMPORTS = winspool kernel32
C_SRCS = \
ntprint.c
diff --git a/dlls/ntprint/ntprint.c b/dlls/ntprint/ntprint.c
index d3f8503..7363b9c 100644
--- a/dlls/ntprint/ntprint.c
+++ b/dlls/ntprint/ntprint.c
@@ -25,8 +25,11 @@
#include "windef.h"
#include "winbase.h"
-#include "winver.h"
+#include "winerror.h"
+#include "wingdi.h"
#include "winnls.h"
+#include "winver.h"
+#include "winspool.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -35,6 +38,11 @@
HINSTANCE NTPRINT_hInstance = NULL;
+typedef struct {
+ LPMONITOR_INFO_2W mi2; /* Buffer for installed Monitors */
+ DWORD installed; /* Number of installed Monitors */
+} monitorinfo_t;
+
/*****************************************************
* DllMain
*/
@@ -54,3 +62,61 @@
}
return TRUE;
}
+
+/*****************************************************
+ * PSetupCreateMonitorInfo [NTPRINT.@]
+ *
+ *
+ */
+
+HANDLE WINAPI PSetupCreateMonitorInfo(LPVOID unknown1, LPVOID unknown2,LPVOID unknown3)
+{
+ monitorinfo_t * mi=NULL;
+ DWORD needed;
+ DWORD res;
+
+ TRACE("(%p, %p, %p)\n", unknown1, unknown2, unknown3);
+
+ if ((unknown2 != NULL) || (unknown3 != NULL)) {
+ FIXME("got unknown parameter: (%p, %p, %p)\n", unknown1, unknown2, unknown3);
+ return NULL;
+ }
+
+ mi = HeapAlloc(GetProcessHeap(), 0, sizeof(monitorinfo_t));
+ if (!mi) {
+ /* FIXME: SetLastError() needed? */
+ return NULL;
+ }
+
+ /* Get the needed size for all Monitors */
+ res = EnumMonitorsW(NULL, 2, NULL, 0, &needed, &mi->installed);
+ if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+ mi->mi2 = HeapAlloc(GetProcessHeap(), 0, needed);
+ res = EnumMonitorsW(NULL, 2, (LPBYTE) mi->mi2, needed, &needed, &mi->installed);
+ }
+
+ if (!res) {
+ HeapFree(GetProcessHeap(), 0, mi);
+ /* FIXME: SetLastError() needed? */
+ return NULL;
+ }
+
+ TRACE("=> %p (%u monitors installed)\n", mi, mi->installed);
+ return (HANDLE) mi;
+}
+
+/*****************************************************
+ * PSetupDestroyMonitorInfo [NTPRINT.@]
+ *
+ */
+
+VOID WINAPI PSetupDestroyMonitorInfo(HANDLE monitorinfo)
+{
+ monitorinfo_t * mi = (monitorinfo_t *) monitorinfo;
+
+ TRACE("(%p)\n", mi);
+ if (mi) {
+ if (mi->installed) HeapFree(GetProcessHeap(), 0, mi->mi2);
+ HeapFree(GetProcessHeap(), 0, mi);
+ }
+}
diff --git a/dlls/ntprint/ntprint.spec b/dlls/ntprint/ntprint.spec
index f703e96..348ab69 100644
--- a/dlls/ntprint/ntprint.spec
+++ b/dlls/ntprint/ntprint.spec
@@ -2,10 +2,10 @@
@ stub PSetupAssociateICMProfiles
@ stub PSetupBuildDriversFromPath
@ stub PSetupCreateDrvSetupPage
-@ stub PSetupCreateMonitorInfo
+@ stdcall PSetupCreateMonitorInfo(long ptr ptr)
@ stub PSetupCreatePrinterDeviceInfoList
@ stub PSetupDestroyDriverInfo3
-@ stub PSetupDestroyMonitorInfo
+@ stdcall PSetupDestroyMonitorInfo(long)
@ stub PSetupDestroyPrinterDeviceInfoList
@ stub PSetupDestroySelectedDriverInfo
@ stub PSetupDriverInfoFromName