ReactOS  0.4.15-dev-1171-gab82533
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 {
13  LPWSTR nameW = NULL;
14  PROVIDOR_INFO_1W pi1W;
15  PROVIDOR_INFO_2W pi2W;
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  {
72  len = MultiByteToWideChar(CP_ACP, 0, pName, -1, NULL, 0);
73  nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
75  }
76 
77  res = AddPrintProvidorW( nameW, Level, pPI );
78 
79  if (pName) HeapFree(GetProcessHeap(), 0, nameW);
80  if (pi1W.pName) HeapFree(GetProcessHeap(), 0, pi1W.pName);
81  if (pi1W.pEnvironment) HeapFree(GetProcessHeap(), 0, pi1W.pEnvironment);
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  }
114  RpcEndExcept;
115 
116  SetLastError(dwErrorCode);
117  return (dwErrorCode == ERROR_SUCCESS);
118 }
119 
120 BOOL WINAPI
121 DeletePrintProvidorA(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);
135  RtlFreeUnicodeString(&EnvW);
136  RtlFreeUnicodeString(&NameW);
137 
138  return Ret;
139 }
140 
141 BOOL WINAPI
142 DeletePrintProvidorW(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  }
157  RpcEndExcept;
158 
159  SetLastError(dwErrorCode);
160  return (dwErrorCode == ERROR_SUCCESS);
161 }
#define RpcEndExcept
Definition: rpc.h:128
#define ERROR_SUCCESS
Definition: deptool.c:10
uint16_t * PWSTR
Definition: typedefs.h:56
#define CP_ACP
Definition: compat.h:109
#define ZeroMemory
Definition: winbase.h:1648
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
BOOL WINAPI AddPrintProvidorW(PWSTR pName, DWORD Level, PBYTE pProviderInfo)
WINSPOOL_PROVIDOR_INFO_1 * pProvidorInfo1
Definition: winspool.idl:727
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define RpcTryExcept
Definition: rpc.h:126
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
smooth NULL
Definition: ftsmooth.c:416
wstring AsciiToUnicode(const char *AsciiString)
Definition: tools.cpp:220
static const WCHAR nameW[]
Definition: main.c:46
DWORD _RpcAddPrintProvidor(WINSPOOL_HANDLE pName, WINSPOOL_PROVIDOR_CONTAINER *pProvidorContainer)
#define RpcExceptionCode()
Definition: rpc.h:132
#define TRACE(s)
Definition: solgame.cpp:4
static LPSTR pName
Definition: security.c:75
#define GetProcessHeap()
Definition: compat.h:484
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
union _WINSPOOL_PROVIDOR_CONTAINER::@3408 ProvidorInfo
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define SetLastError(x)
Definition: compat.h:500
GLenum GLsizei len
Definition: glext.h:6722
BOOL WINAPI DeletePrintProvidorA(PSTR pName, PSTR pEnvironment, PSTR pPrintProviderName)
BOOL WINAPI AddPrintProvidorA(PSTR pName, DWORD Level, PBYTE pProviderInfo)
#define ERR(fmt,...)
Definition: debug.h:110
LPWSTR pEnvironment
Definition: winspool.h:1311
DWORD _RpcDeletePrintProvidor(WINSPOOL_HANDLE pName, WCHAR *pEnvironment, WCHAR *pPrintProviderName)
signed char * PSTR
Definition: retypes.h:7
#define MultiByteToWideChar
Definition: compat.h:110
BOOL WINAPI DeletePrintProvidorW(PWSTR pName, PWSTR pEnvironment, PWSTR pPrintProviderName)
GLuint res
Definition: glext.h:9613
#define ERROR_INVALID_LEVEL
Definition: winerror.h:196
WCHAR * LPWSTR
Definition: xmlstorage.h:184
BYTE * PBYTE
Definition: pedump.c:66
#define HeapFree(x, y, z)
Definition: compat.h:483
#define RpcExcept(expr)
Definition: rpc.h:127