2 * Unit test suite for the Spooler-Service helper DLL
4 * Copyright 2007 Detlef Riekenberg
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/test.h"
33 static HMODULE hwinspool
;
36 static BOOL (WINAPI
* pBuildOtherNamesFromMachineName
)(LPWSTR
**, LPDWORD
);
37 static DWORD (WINAPI
* pSplInitializeWinSpoolDrv
)(LPVOID
*);
39 #define WINSPOOL_TABLESIZE 16
41 static LPVOID fn_spl
[WINSPOOL_TABLESIZE
];
42 static LPVOID fn_w2k
[WINSPOOL_TABLESIZE
];
43 static LPVOID fn_xp
[WINSPOOL_TABLESIZE
];
44 static LPVOID fn_v
[WINSPOOL_TABLESIZE
];
46 /* ########################### */
48 static LPCSTR
load_functions(void)
53 hspl
= LoadLibraryA(ptr
);
54 if (!hspl
) return ptr
;
56 ptr
= "BuildOtherNamesFromMachineName";
57 pBuildOtherNamesFromMachineName
= (void *) GetProcAddress(hspl
, ptr
);
58 if (!pBuildOtherNamesFromMachineName
) return ptr
;
60 ptr
= "SplInitializeWinSpoolDrv";
61 pSplInitializeWinSpoolDrv
= (void *) GetProcAddress(hspl
, ptr
);
62 if (!pSplInitializeWinSpoolDrv
) return ptr
;
65 /* Calling BuildOtherNamesFromMachineName or SplInitializeWinSpoolDrv on
66 * Win7 results in a breakpoint exception. If you continue after hitting
67 * the breakpoint, the functions fail with ERROR_NOT_SUPPORTED. So we
68 * just skip the tests on Win7, since they won't provide any useful info.
69 * To detect Win7, we check whether UnloadDriver exists (it doesn't on
70 * Win7, but does exist on earlier Windows versions) */
72 if (GetProcAddress(hspl
, ptr
) == NULL
) return ptr
;
76 hwinspool
= LoadLibraryA(ptr
);
77 if (!hwinspool
) return ptr
;
79 memset(fn_w2k
, 0xff, sizeof(fn_w2k
));
80 fn_w2k
[0] = (void *) GetProcAddress(hwinspool
, "OpenPrinterW");
81 fn_w2k
[1] = (void *) GetProcAddress(hwinspool
, "ClosePrinter");
82 fn_w2k
[2] = (void *) GetProcAddress(hwinspool
, "SpoolerDevQueryPrintW");
83 fn_w2k
[3] = (void *) GetProcAddress(hwinspool
, "SpoolerPrinterEvent");
84 fn_w2k
[4] = (void *) GetProcAddress(hwinspool
, "DocumentPropertiesW");
85 fn_w2k
[5] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 212); /* LoadPrinterDriver */
86 fn_w2k
[6] = (void *) GetProcAddress(hwinspool
, "SetDefaultPrinterW");
87 fn_w2k
[7] = (void *) GetProcAddress(hwinspool
, "GetDefaultPrinterW");
88 fn_w2k
[8] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 213); /* RefCntLoadDriver */
89 fn_w2k
[9] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 214); /* RefCntUnloadDriver */
90 fn_w2k
[10] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 215); /* ForceUnloadDriver */
92 memset(fn_xp
, 0xff, sizeof(fn_xp
));
93 fn_xp
[0] = (void *) GetProcAddress(hwinspool
, "OpenPrinterW");
94 fn_xp
[1] = (void *) GetProcAddress(hwinspool
, "ClosePrinter");
95 fn_xp
[2] = (void *) GetProcAddress(hwinspool
, "SpoolerDevQueryPrintW");
96 fn_xp
[3] = (void *) GetProcAddress(hwinspool
, "SpoolerPrinterEvent");
97 fn_xp
[4] = (void *) GetProcAddress(hwinspool
, "DocumentPropertiesW");
98 fn_xp
[5] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 212); /* LoadPrinterDriver */
99 fn_xp
[6] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 213); /* RefCntLoadDriver */
100 fn_xp
[7] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 214); /* RefCntUnloadDriver */
101 fn_xp
[8] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 215); /* ForceUnloadDriver */
103 memset(fn_v
, 0xff, sizeof(fn_v
));
104 fn_v
[0] = (void *) GetProcAddress(hwinspool
, "OpenPrinterW");
105 fn_v
[1] = (void *) GetProcAddress(hwinspool
, "ClosePrinter");
106 fn_v
[2] = (void *) GetProcAddress(hwinspool
, "SpoolerDevQueryPrintW");
107 fn_v
[3] = (void *) GetProcAddress(hwinspool
, "SpoolerPrinterEvent");
108 fn_v
[4] = (void *) GetProcAddress(hwinspool
, "DocumentPropertiesW");
109 fn_v
[5] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 212); /* LoadPrinterDriver */
110 fn_v
[6] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 213); /* RefCntLoadDriver */
111 fn_v
[7] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 214); /* RefCntUnloadDriver */
112 fn_v
[8] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 215); /* ForceUnloadDriver */
113 fn_v
[9] = (void *) GetProcAddress(hwinspool
, (LPSTR
) 251); /* 0xfb */
119 /* ########################### */
121 static void test_BuildOtherNamesFromMachineName(void)
130 SetLastError(0xdeadbeef);
131 res
= pBuildOtherNamesFromMachineName(&buffers
, &numentries
);
133 /* An array with a number of stringpointers is returned (minimum of 3):
134 entry_#0: "" (empty String)
135 entry_#1: <hostname> (this is the same as the computername)
136 1 entry per Ethernet adapter : <ip-address> (string with a IPv4 ip-address)
140 IPv6 fully disabled (lan interfaces, connections, tunnel interfaces and loopback interfaces)
141 entry_#0: "" (empty String)
142 entry_#1: <hostname> (this is the same as the computername)
143 1 entry per Ethernet adapter : <ip-address> (string with a IPv4 ip-address)
146 IPv6 partly disabled (lan interfaces, connections):
147 entry_#0: "" (empty String)
148 entry_#1: <hostname> (this is the same as the computername)
150 1 entry per Ethernet adapter : <ip-address> (string with a IPv4 ip-address)
152 IPv6 fully enabled but not on all lan interfaces:
153 entry_#0: "" (empty String)
154 entry_#1: <hostname> (this is the same as the computername)
155 1 entry per IPv6 enabled Ethernet adapter : <ip-address> (string with a Link-local IPv6 ip-address)
156 1 entry per IPv4 enabled Ethernet adapter : <ip-address> (string with a IPv4 ip-address)
158 IPv6 fully enabled on all lan interfaces:
159 entry_#0: "" (empty String)
160 entry_#1: <hostname> (this is the same as the computername)
161 1 entry per IPv6 enabled Ethernet adapter : <ip-address> (string with a Link-local IPv6 ip-address)
162 entry_#x: <ip-address> Tunnel adapter (string with a Link-local IPv6 ip-address)
163 1 entry per IPv4 enabled Ethernet adapter : <ip-address> (string with a IPv4 ip-address)
164 entry_#y: <ip-address> Tunnel adapter (string with a IPv6 ip-address)
168 ok( res
&& (buffers
!= NULL
) && (numentries
>= 3) && (buffers
[0] != NULL
) && (buffers
[0][0] == '\0'),
169 "got %u with %u and %p,%u (%p:%d)\n", res
, GetLastError(), buffers
, numentries
,
170 ((numentries
> 0) && buffers
) ? buffers
[0] : NULL
,
171 ((numentries
> 0) && buffers
&& buffers
[0]) ? lstrlenW(buffers
[0]) : -1);
175 /* ########################### */
177 static void test_SplInitializeWinSpoolDrv(VOID
)
179 LPVOID
*fn_ref
= fn_xp
;
183 memset(fn_spl
, 0xff, sizeof(fn_spl
));
184 SetLastError(0xdeadbeef);
185 res
= pSplInitializeWinSpoolDrv(fn_spl
);
186 ok(res
, "got %u with %u (expected '!= 0')\n", res
, GetLastError());
188 /* functions 0 to 5 are the same in "spoolss.dll" from w2k and above */
189 if (fn_spl
[6] == fn_w2k
[6]) {
192 if (fn_spl
[9] == fn_v
[9]) {
197 while (id
< WINSPOOL_TABLESIZE
) {
198 ok( fn_spl
[id
] == fn_ref
[id
],
199 "(#%02u) spoolss: %p (vista: %p, xp: %p, w2k: %p)\n",
200 id
, fn_spl
[id
], fn_v
[id
], fn_xp
[id
], fn_w2k
[id
]);
205 /* ########################### */
211 /* The tests fail on Win7 (see comments in load_function() */
212 ptr
= load_functions();
214 win_skip("%s not found\n", ptr
);
218 test_BuildOtherNamesFromMachineName();
219 test_SplInitializeWinSpoolDrv();