Author: cfinck
Date: Wed Jan 6 04:31:53 2016
New Revision: 70503
URL:
http://svn.reactos.org/svn/reactos?rev=70503&view=rev
Log:
[WINSPOOL]
Add and fully implement IsValidDevmodeA and IsValidDevmodeW.
[WINSPOOL_APITEST]
Add tests for IsValidDevmodeA and IsValidDevmodeW covering the entire functions.
Added:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/devmode.c
(with props)
branches/colins-printing-for-freedom/rostests/apitests/winspool/IsValidDevmode.c
(with props)
Modified:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/CMakeLists.txt
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec
branches/colins-printing-for-freedom/rostests/apitests/winspool/CMakeLists.txt
branches/colins-printing-for-freedom/rostests/apitests/winspool/testlist.c
Modified:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/CMakeLists.txt [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/CMakeLists.txt [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -4,6 +4,7 @@
spec2def(winspool.drv winspool.spec ADD_IMPORTLIB)
list(APPEND SOURCE
+ devmode.c
jobs.c
main.c
monitors.c
Added:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/devmode.c
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/devmode.c (added)
+++
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/devmode.c [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -0,0 +1,42 @@
+/*
+ * PROJECT: ReactOS Spooler API
+ * LICENSE: GNU LGPL v2.1 or any later version as published by the Free Software
Foundation
+ * PURPOSE: Functions giving information about DEVMODE structures
+ * COPYRIGHT: Copyright 2016 Colin Finck <colin(a)reactos.org>
+ */
+
+#include "precomp.h"
+
+BOOL WINAPI
+IsValidDevmodeA(PDEVMODEA pDevmode, size_t DevmodeSize)
+{
+ // Check if a Devmode was given, its dmSize member is at least as big as the DEVMODEA
structure
+ // and DevmodeSize is large enough for the public and private members of the
structure.
+ if (!pDevmode ||
+ pDevmode->dmSize < sizeof(DEVMODEA) ||
+ DevmodeSize < pDevmode->dmSize + pDevmode->dmDriverExtra)
+ {
+ SetLastError(ERROR_INVALID_DATA);
+ return FALSE;
+ }
+
+ // Return success without setting the error code.
+ return TRUE;
+}
+
+BOOL WINAPI
+IsValidDevmodeW(PDEVMODEW pDevmode, size_t DevmodeSize)
+{
+ // Check if a Devmode was given, its dmSize member is at least as big as the DEVMODEW
structure
+ // and DevmodeSize is large enough for the public and private members of the
structure.
+ if (!pDevmode ||
+ pDevmode->dmSize < sizeof(DEVMODEW) ||
+ DevmodeSize < pDevmode->dmSize + pDevmode->dmDriverExtra)
+ {
+ SetLastError(ERROR_INVALID_DATA);
+ return FALSE;
+ }
+
+ // Return success without setting the error code.
+ return TRUE;
+}
Propchange:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/devmode.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -157,8 +157,8 @@
256 stdcall GetPrinterDriverW(long wstr long ptr long ptr)
257 stdcall GetPrinterW(long long ptr long ptr)
258 stub GetSpoolFileHandle
-259 stub IsValidDevmodeA
-260 stub IsValidDevmodeW
+259 stdcall IsValidDevmodeA(ptr long)
+260 stdcall IsValidDevmodeW(ptr long)
261 stdcall OpenPrinterA(str ptr ptr)
262 stdcall OpenPrinterW(wstr ptr ptr)
263 stub PlayGdiScriptOnPrinterIC
Modified: branches/colins-printing-for-freedom/rostests/apitests/winspool/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/ros…
==============================================================================
---
branches/colins-printing-for-freedom/rostests/apitests/winspool/CMakeLists.txt [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/rostests/apitests/winspool/CMakeLists.txt [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -4,6 +4,7 @@
EnumPrinters.c
EnumPrintProcessorDatatypes.c
GetPrintProcessorDirectory.c
+ IsValidDevmode.c
OpenPrinter.c
StartDocPrinter.c
testlist.c)
Added: branches/colins-printing-for-freedom/rostests/apitests/winspool/IsValidDevmode.c
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/ros…
==============================================================================
---
branches/colins-printing-for-freedom/rostests/apitests/winspool/IsValidDevmode.c (added)
+++
branches/colins-printing-for-freedom/rostests/apitests/winspool/IsValidDevmode.c [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -0,0 +1,130 @@
+/*
+ * PROJECT: ReactOS Print Spooler DLL API Tests
+ * LICENSE: GNU GPLv2 or any later version as published by the Free Software
Foundation
+ * PURPOSE: Tests for IsValidDevmodeA/IsValidDevmodeW
+ * COPYRIGHT: Copyright 2016 Colin Finck <colin(a)reactos.org>
+ */
+
+#include <apitest.h>
+
+#define WIN32_NO_STATUS
+#include <windef.h>
+#include <winbase.h>
+#include <wingdi.h>
+#include <winspool.h>
+
+// With very high probability, this is everything you can test for IsValidDevmode.
+// For your own testing, you can fill a DevMode structure with random bytes multiple
times,
+// always set dmSize and dmDriverExtra appropriately and feed it to IsValidDevmode.
+// The function will always succeed.
+// I'm not doing that here, because I don't want to introduce randomness.
+
+START_TEST(IsValidDevmodeA)
+{
+ DEVMODEA DevMode;
+
+ // Give no Devmode at all, this has to fail without crashing.
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeA(NULL, sizeof(DEVMODEA)), "IsValidDevmodeA returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeA returns error
%lu!\n", GetLastError());
+
+ // Give a zeroed Devmode, this has to fail, because dmSize isn't set.
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeA(&DevMode, sizeof(DEVMODEA)), "IsValidDevmodeA returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeA returns error
%lu!\n", GetLastError());
+
+ // Now set only the dmSize member, IsValidDevmodeA should return TRUE now. The Last
Error isn't touched again.
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ DevMode.dmSize = sizeof(DEVMODEA);
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeA(&DevMode, sizeof(DEVMODEA)), "IsValidDevmodeA returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeA returns error %lu!\n",
GetLastError());
+
+ // IsValidDevmodeA should also succeed if the DevMode appears to be larger.
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ DevMode.dmSize = sizeof(DEVMODEA) + 1;
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeA(&DevMode, sizeof(DEVMODEA) + 1), "IsValidDevmodeA returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeA returns error %lu!\n",
GetLastError());
+
+ // The DevmodeSize parameter may be larger than dmSize, but not the other way round!
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ DevMode.dmSize = sizeof(DEVMODEA);
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeA(&DevMode, sizeof(DEVMODEA) + 1), "IsValidDevmodeA returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeA returns error %lu!\n",
GetLastError());
+
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ DevMode.dmSize = sizeof(DEVMODEA) + 1;
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeA(&DevMode, sizeof(DEVMODEA)), "IsValidDevmodeA returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeA returns error
%lu!\n", GetLastError());
+
+ // dmDriverExtra is also taken into account.
+ ZeroMemory(&DevMode, sizeof(DEVMODEA));
+ DevMode.dmSize = sizeof(DEVMODEA);
+ DevMode.dmDriverExtra = 1;
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeA(&DevMode, sizeof(DEVMODEA)), "IsValidDevmodeA returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeA returns error
%lu!\n", GetLastError());
+
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeA(&DevMode, sizeof(DEVMODEA) + 1), "IsValidDevmodeA returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeA returns error %lu!\n",
GetLastError());
+}
+
+START_TEST(IsValidDevmodeW)
+{
+ DEVMODEW DevMode;
+
+ // Give no Devmode at all, this has to fail without crashing.
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeW(NULL, sizeof(DEVMODEW)), "IsValidDevmodeW returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeW returns error
%lu!\n", GetLastError());
+
+ // Give a zeroed Devmode, this has to fail, because dmSize isn't set.
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeW(&DevMode, sizeof(DEVMODEW)), "IsValidDevmodeW returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeW returns error
%lu!\n", GetLastError());
+
+ // Now set only the dmSize member, IsValidDevmodeW should return TRUE now. The Last
Error isn't touched again.
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ DevMode.dmSize = sizeof(DEVMODEW);
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeW(&DevMode, sizeof(DEVMODEW)), "IsValidDevmodeW returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeW returns error %lu!\n",
GetLastError());
+
+ // IsValidDevmodeW should also succeed if the DevMode appears to be larger.
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ DevMode.dmSize = sizeof(DEVMODEW) + 1;
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeW(&DevMode, sizeof(DEVMODEW) + 1), "IsValidDevmodeW returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeW returns error %lu!\n",
GetLastError());
+
+ // The DevmodeSize parameter may be larger than dmSize, but not the other way round!
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ DevMode.dmSize = sizeof(DEVMODEW);
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeW(&DevMode, sizeof(DEVMODEW) + 1), "IsValidDevmodeW returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeW returns error %lu!\n",
GetLastError());
+
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ DevMode.dmSize = sizeof(DEVMODEW) + 1;
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeW(&DevMode, sizeof(DEVMODEW)), "IsValidDevmodeW returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeW returns error
%lu!\n", GetLastError());
+
+ // dmDriverExtra is also taken into account.
+ ZeroMemory(&DevMode, sizeof(DEVMODEW));
+ DevMode.dmSize = sizeof(DEVMODEW);
+ DevMode.dmDriverExtra = 1;
+ SetLastError(0xDEADBEEF);
+ ok(!IsValidDevmodeW(&DevMode, sizeof(DEVMODEW)), "IsValidDevmodeW returns
TRUE!\n");
+ ok(GetLastError() == ERROR_INVALID_DATA, "IsValidDevmodeW returns error
%lu!\n", GetLastError());
+
+ SetLastError(0xDEADBEEF);
+ ok(IsValidDevmodeW(&DevMode, sizeof(DEVMODEW) + 1), "IsValidDevmodeW returns
FALSE!\n");
+ ok(GetLastError() == 0xDEADBEEF, "IsValidDevmodeW returns error %lu!\n",
GetLastError());
+}
Propchange:
branches/colins-printing-for-freedom/rostests/apitests/winspool/IsValidDevmode.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: branches/colins-printing-for-freedom/rostests/apitests/winspool/testlist.c
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/ros…
==============================================================================
---
branches/colins-printing-for-freedom/rostests/apitests/winspool/testlist.c [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/rostests/apitests/winspool/testlist.c [iso-8859-1]
Wed Jan 6 04:31:53 2016
@@ -2,7 +2,7 @@
* PROJECT: ReactOS Print Spooler DLL API Tests
* LICENSE: GNU GPLv2 or any later version as published by the Free Software
Foundation
* PURPOSE: Test list
- * COPYRIGHT: Copyright 2015 Colin Finck <colin(a)reactos.org>
+ * COPYRIGHT: Copyright 2015-2016 Colin Finck <colin(a)reactos.org>
*/
#define __ROS_LONG64__
@@ -14,6 +14,8 @@
extern void func_EnumPrinters(void);
extern void func_EnumPrintProcessorDatatypes(void);
extern void func_GetPrintProcessorDirectory(void);
+extern void func_IsValidDevmodeA(void);
+extern void func_IsValidDevmodeW(void);
extern void func_OpenPrinter(void);
extern void func_StartDocPrinter(void);
@@ -23,6 +25,8 @@
{ "EnumPrinters", func_EnumPrinters },
{ "EnumPrintProcessorDatatypes", func_EnumPrintProcessorDatatypes },
{ "GetPrintProcessorDirectory", func_GetPrintProcessorDirectory },
+ { "IsValidDevmodeA", func_IsValidDevmodeA },
+ { "IsValidDevmodeW", func_IsValidDevmodeW },
{ "OpenPrinter", func_OpenPrinter },
{ "StartDocPrinter", func_StartDocPrinter },