ReactOS 0.4.15-dev-7918-g2a2556c
printproviders.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Spooler API
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Print Providers
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
6 */
7
8#include "precomp.h"
9
12{
16 DWORD len;
17 BOOL res;
18 PBYTE pPI = NULL;
19
20 TRACE("AddPrintProvidorA(%s, %lu, %p)\n", pName, Level, pProviderInfo);
21
22 ZeroMemory(&pi1W, sizeof(PROVIDOR_INFO_1W));
23 pi2W.pOrder = NULL;
24
25 switch (Level)
26 {
27 case 1:
28 {
29 PROVIDOR_INFO_1A *pi1A = (PROVIDOR_INFO_1A*)pProviderInfo;
30 if (pi1A->pName)
31 {
32 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, NULL, 0);
33 pi1W.pName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
34 MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, pi1W.pName, len);
35 }
36 if (pi1A->pEnvironment)
37 {
38 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pEnvironment, -1, NULL, 0);
39 pi1W.pEnvironment = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
41 }
42 if (pi1A->pDLLName)
43 {
44 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, NULL, 0);
45 pi1W.pDLLName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
46 MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, pi1W.pDLLName, len);
47 }
48 pPI = (PBYTE)&pi1W;
49 }
50 break;
51
52 case 2:
53 {
54 PROVIDOR_INFO_2A *pi2A = (PROVIDOR_INFO_2A*)pProviderInfo;
55 if (pi2A->pOrder)
56 {
57 len = MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, NULL, 0);
58 pi2W.pOrder = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
59 MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, pi2W.pOrder, len);
60 }
61 pPI = (PBYTE)&pi2W;
62 }
63 break;
64
65 default:
67 return FALSE;
68 }
69
70 if (pName)
71 {
73 nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
75 }
76
78
80 if (pi1W.pName) HeapFree(GetProcessHeap(), 0, pi1W.pName);
82 if (pi1W.pDLLName) HeapFree(GetProcessHeap(), 0, pi1W.pDLLName);
83 if (pi2W.pOrder) HeapFree(GetProcessHeap(), 0, pi2W.pOrder);
84
85 return res;
86}
87
90{
91 DWORD dwErrorCode;
92 WINSPOOL_PROVIDOR_CONTAINER ProvidorContainer;
93
94 TRACE("AddPrintProvidorW(%S, %lu, %p)\n", pName, Level, pProviderInfo);
95
96 if ((Level < 1) || (Level > 2))
97 {
99 return FALSE;
100 }
101
102 ProvidorContainer.ProvidorInfo.pProvidorInfo1 = (WINSPOOL_PROVIDOR_INFO_1*)pProviderInfo;
103 ProvidorContainer.Level = Level;
104
106 {
107 dwErrorCode = _RpcAddPrintProvidor( pName, &ProvidorContainer );
108 }
110 {
111 dwErrorCode = RpcExceptionCode();
112 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode);
113 }
115
116 SetLastError(dwErrorCode);
117 return (dwErrorCode == ERROR_SUCCESS);
118}
119
121DeletePrintProvidorA(PSTR pName, PSTR pEnvironment, PSTR pPrintProviderName)
122{
123 UNICODE_STRING NameW, EnvW, ProviderW;
124 BOOL Ret;
125
126 TRACE("DeletePrintProvidorW(%s, %s, %s)\n", pName, pEnvironment, pPrintProviderName);
127
128 AsciiToUnicode(&NameW, pName);
129 AsciiToUnicode(&EnvW, pEnvironment);
130 AsciiToUnicode(&ProviderW, pPrintProviderName);
131
132 Ret = DeletePrintProvidorW(NameW.Buffer, EnvW.Buffer, ProviderW.Buffer);
133
134 RtlFreeUnicodeString(&ProviderW);
136 RtlFreeUnicodeString(&NameW);
137
138 return Ret;
139}
140
142DeletePrintProvidorW(PWSTR pName, PWSTR pEnvironment, PWSTR pPrintProviderName)
143{
144 DWORD dwErrorCode;
145
146 TRACE("DeletePrintProvidorW(%S, %S, %S)\n", pName, pEnvironment, pPrintProviderName);
147
149 {
150 dwErrorCode = _RpcDeletePrintProvidor( pName, pEnvironment, pPrintProviderName );
151 }
153 {
154 dwErrorCode = RpcExceptionCode();
155 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode);
156 }
158
159 SetLastError(dwErrorCode);
160 return (dwErrorCode == ERROR_SUCCESS);
161}
static const WCHAR nameW[]
Definition: main.c:46
#define ERR(fmt,...)
Definition: debug.h:110
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define MultiByteToWideChar
Definition: compat.h:110
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLenum GLsizei len
Definition: glext.h:6722
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
wstring AsciiToUnicode(const char *AsciiString)
Definition: tools.cpp:220
static LPSTR pName
Definition: security.c:75
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
BYTE * PBYTE
Definition: pedump.c:66
#define RpcEndExcept
Definition: rpc.h:128
#define RpcTryExcept
Definition: rpc.h:126
#define RpcExcept(expr)
Definition: rpc.h:127
#define RpcExceptionCode()
Definition: rpc.h:132
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI DeletePrintProvidorW(PWSTR pName, PWSTR pEnvironment, PWSTR pPrintProviderName)
BOOL WINAPI AddPrintProvidorW(PWSTR pName, DWORD Level, PBYTE pProviderInfo)
DWORD _RpcDeletePrintProvidor(WINSPOOL_HANDLE pName, WCHAR *pEnvironment, WCHAR *pPrintProviderName)
DWORD _RpcAddPrintProvidor(WINSPOOL_HANDLE pName, WINSPOOL_PROVIDOR_CONTAINER *pProvidorContainer)
LPWSTR pEnvironment
Definition: winspool.h:1311
WINSPOOL_PROVIDOR_INFO_1 * pProvidorInfo1
Definition: winspool.idl:727
union _WINSPOOL_PROVIDOR_CONTAINER::@3447 ProvidorInfo
uint16_t * PWSTR
Definition: typedefs.h:56
char * PSTR
Definition: typedefs.h:51
#define ZeroMemory
Definition: winbase.h:1712
#define WINAPI
Definition: msvc.h:6
#define ERROR_INVALID_LEVEL
Definition: winerror.h:196
BOOL WINAPI AddPrintProvidorA(PSTR pName, DWORD Level, PBYTE pProviderInfo)
BOOL WINAPI DeletePrintProvidorA(PSTR pName, PSTR pEnvironment, PSTR pPrintProviderName)
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184