Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
10 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. print.c
  5. Abstract:
  6. This module contains utilitarian functions.
  7. Author:
  8. Wesley Witt (wesw) 29-Nov-1996
  9. Revision History:
  10. --*/
  11. #include "faxapi.h"
  12. #pragma hdrstop
  13. #include <mbstring.h>
  14. BOOL
  15. ConvertUnicodeStringInPlace(
  16. LPCWSTR lptstrUnicodeString
  17. )
  18. /*++
  19. Routine name : ConvertUnicodeStringInPlace
  20. Routine description:
  21. Converts a Unicode string to a multi-byte string and stores that multi-byte string
  22. in the original Unicode buffer.
  23. Notice: In some bizarre code pages, with some very bizarre Unicode strings, the
  24. converted multi-byte string can be longer (in bytes) than the original Unicode string.
  25. In that case, it's OK to just detect and fail.
  26. The cases where it will fail are rare and odd.
  27. The only real threat today is via a hacker who is deliberately looking for these cases.
  28. Author:
  29. Eran Yariv (EranY), Dec, 1999
  30. Arguments:
  31. lptstrUnicodeString [in / out ] - On input, the Unicode string.
  32. On output, the MBCS string.
  33. Return Value:
  34. TRUE - Success
  35. FALSE - Failure, call GetLastError() for more error information.
  36. --*/
  37. {
  38. LPSTR AnsiString;
  39. DEBUG_FUNCTION_NAME(TEXT("ConvertUnicodeStringInPlace"));
  40. if (NULL == lptstrUnicodeString)
  41. {
  42. return TRUE;
  43. }
  44. AnsiString = UnicodeStringToAnsiString(lptstrUnicodeString);
  45. if (AnsiString)
  46. {
  47. if (sizeof (WCHAR) * (1 + wcslen(lptstrUnicodeString)) < sizeof (CHAR) * (1 + _mbstrlen(AnsiString)))
  48. {
  49. //
  50. // Ooops! MBCS string takes longer then original Unicode String.
  51. // In some bizarre code pages, with some very bizarre Unicode strings, the
  52. // converted multi-byte string can be longer (in bytes) than the original Unicode string.
  53. // In that case, it's OK to just detect and fail.
  54. // The cases where it will fail are rare and odd.
  55. // The only real threat today is via a hacker who is deliberately looking for these cases
  56. //
  57. MemFree(AnsiString);
  58. SetLastError (ERROR_INVALID_PARAMETER);
  59. return FALSE;
  60. }
  61. _mbscpy((PUCHAR)lptstrUnicodeString, (PUCHAR)AnsiString);
  62. MemFree(AnsiString);
  63. }
  64. else
  65. {
  66. return FALSE;
  67. }
  68. return TRUE;
  69. } // ConvertUnicodeStringInPlace
  70. BOOL
  71. WINAPI
  72. FaxCompleteJobParamsA(
  73. IN OUT PFAX_JOB_PARAMA *JobParamsBuffer,
  74. IN OUT PFAX_COVERPAGE_INFOA *CoverpageInfoBuffer
  75. )
  76. {
  77. PFAX_JOB_PARAMA JobParams;
  78. PFAX_COVERPAGE_INFOA CoverpageInfo;
  79. DEBUG_FUNCTION_NAME(TEXT("FaxCompleteJobParamsA"));
  80. if (!JobParamsBuffer || !CoverpageInfoBuffer)
  81. {
  82. SetLastError(ERROR_INVALID_PARAMETER);
  83. return FALSE;
  84. }
  85. *JobParamsBuffer = NULL;
  86. *CoverpageInfoBuffer = NULL;
  87. if (!FaxCompleteJobParamsW((PFAX_JOB_PARAMW *)JobParamsBuffer,(PFAX_COVERPAGE_INFOW *)CoverpageInfoBuffer) )
  88. {
  89. return FALSE;
  90. }
  91. JobParams = *JobParamsBuffer;
  92. CoverpageInfo = *CoverpageInfoBuffer;
  93. if (!ConvertUnicodeStringInPlace( (LPWSTR) JobParams->Tsid) ||
  94. !ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderName) ||
  95. !ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderCompany) ||
  96. !ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderDept) ||
  97. !ConvertUnicodeStringInPlace( (LPWSTR) JobParams->BillingCode) ||
  98. !ConvertUnicodeStringInPlace( (LPWSTR) JobParams->DeliveryReportAddress)||
  99. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrName) ||
  100. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrFaxNumber) ||
  101. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrCompany) ||
  102. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrAddress) ||
  103. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrTitle) ||
  104. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrDepartment) ||
  105. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficeLocation)||
  106. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrHomePhone) ||
  107. !ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficePhone))
  108. {
  109. DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError());
  110. MemFree (*JobParamsBuffer);
  111. MemFree (*CoverpageInfoBuffer);
  112. return FALSE;
  113. }
  114. return TRUE;
  115. } // FaxCompleteJobParamsA
  116. BOOL
  117. WINAPI
  118. FaxCompleteJobParamsW(
  119. IN OUT PFAX_JOB_PARAMW *JobParamsBuffer,
  120. IN OUT PFAX_COVERPAGE_INFOW *CoverpageInfoBuffer
  121. )
  122. {
  123. #define RegStrLen(pValueName,lpdwNeeded) \
  124. RegQueryValueEx(hKey,pValueName,NULL,NULL,NULL,lpdwNeeded)
  125. #define RegStrCpy(pValueName, szPointer, Offset) \
  126. dwNeeded = 256*sizeof(TCHAR); \
  127. rslt = RegQueryValueEx(hKey,pValueName,NULL,NULL,(LPBYTE)TempBuffer,&dwNeeded);\
  128. if (rslt == ERROR_SUCCESS) { \
  129. szPointer = Offset; \
  130. wcscpy((LPWSTR)Offset,TempBuffer); \
  131. Offset = Offset + wcslen(Offset) +1; \
  132. }
  133. PFAX_JOB_PARAMW JobParams = NULL;
  134. PFAX_COVERPAGE_INFOW CoverpageInfo = NULL;
  135. HKEY hKey;
  136. BOOL fSuccess=FALSE;
  137. long rslt = ERROR_SUCCESS;
  138. DWORD dwJobNeeded = sizeof (FAX_JOB_PARAMW);
  139. DWORD dwCoverNeeded = sizeof (FAX_COVERPAGE_INFOW);
  140. DWORD dwNeeded = 0;
  141. WCHAR *CPOffset = NULL, *JobOffset = NULL;
  142. WCHAR TempBuffer[256];
  143. if (!JobParamsBuffer || !CoverpageInfoBuffer) {
  144. SetLastError(ERROR_INVALID_PARAMETER);
  145. return FALSE;
  146. }
  147. *JobParamsBuffer = NULL;
  148. *CoverpageInfoBuffer = NULL;
  149. //
  150. // open the key holding our data
  151. //
  152. rslt = RegOpenKeyEx(HKEY_CURRENT_USER,REGKEY_FAX_USERINFO,0,KEY_READ,&hKey);
  153. if (rslt != ERROR_SUCCESS &&
  154. rslt != ERROR_FILE_NOT_FOUND)
  155. {
  156. SetLastError(rslt);
  157. return FALSE;
  158. }
  159. //
  160. // find out how much space we need
  161. //
  162. if (ERROR_SUCCESS == rslt)
  163. {
  164. //
  165. // Copy data from registry only if it available.
  166. //
  167. RegStrLen(REGVAL_FULLNAME,&dwNeeded);
  168. dwCoverNeeded += dwNeeded+1;
  169. dwJobNeeded +=dwNeeded+1;
  170. RegStrLen(REGVAL_COMPANY,&dwNeeded);
  171. dwCoverNeeded += dwNeeded+1;
  172. dwJobNeeded +=dwNeeded+1;
  173. RegStrLen(REGVAL_DEPT,&dwNeeded);
  174. dwCoverNeeded += dwNeeded+1;
  175. dwJobNeeded +=dwNeeded+1;
  176. RegStrLen(REGVAL_FAX_NUMBER,&dwNeeded);
  177. dwCoverNeeded += dwNeeded+1;
  178. dwJobNeeded +=dwNeeded+1;
  179. RegStrLen(REGVAL_ADDRESS,&dwNeeded);
  180. dwCoverNeeded += dwNeeded+1;
  181. RegStrLen(REGVAL_TITLE,&dwNeeded);
  182. dwCoverNeeded += dwNeeded+1;
  183. RegStrLen(REGVAL_OFFICE,&dwNeeded);
  184. dwCoverNeeded += dwNeeded+1;
  185. RegStrLen(REGVAL_HOME_PHONE,&dwNeeded);
  186. dwCoverNeeded += dwNeeded+1;
  187. RegStrLen(REGVAL_OFFICE_PHONE,&dwNeeded);
  188. dwCoverNeeded += dwNeeded+1;
  189. RegStrLen(REGVAL_BILLING_CODE,&dwNeeded);
  190. dwJobNeeded +=dwNeeded+1;
  191. RegStrLen(REGVAL_MAILBOX,&dwNeeded);
  192. // one for email address, one for DR address
  193. dwJobNeeded +=dwNeeded+1;
  194. dwJobNeeded +=dwNeeded+1;
  195. }
  196. //
  197. // alloc the space
  198. //
  199. JobParams = (PFAX_JOB_PARAMW)MemAlloc(dwJobNeeded*sizeof(WCHAR));
  200. CoverpageInfo = (PFAX_COVERPAGE_INFOW)MemAlloc(dwCoverNeeded*sizeof(WCHAR));
  201. if (!JobParams || !CoverpageInfo ) {
  202. RegCloseKey(hKey);
  203. if (JobParams) {
  204. MemFree( JobParams );
  205. }
  206. if (CoverpageInfo) {
  207. MemFree( CoverpageInfo );
  208. }
  209. SetLastError (ERROR_NOT_ENOUGH_MEMORY);
  210. return FALSE;
  211. }
  212. //
  213. // fill in the data
  214. //
  215. ZeroMemory(JobParams,sizeof(FAX_JOB_PARAMW) );
  216. JobParams->SizeOfStruct = sizeof(FAX_JOB_PARAMW);
  217. JobParams->ScheduleAction = JSA_NOW;
  218. JobParams->DeliveryReportType = DRT_NONE;
  219. ZeroMemory(CoverpageInfo,sizeof(FAX_COVERPAGE_INFOW));
  220. CoverpageInfo->SizeOfStruct = sizeof(FAX_COVERPAGE_INFOW);
  221. if (ERROR_SUCCESS == rslt)
  222. {
  223. //
  224. // Copy data from registry only if it available.
  225. //
  226. CPOffset = (WCHAR *) ( (LPBYTE) CoverpageInfo + sizeof(FAX_COVERPAGE_INFOW));
  227. JobOffset = (WCHAR *)( (LPBYTE) JobParams + sizeof(FAX_JOB_PARAMW));
  228. RegStrCpy(REGVAL_FULLNAME,CoverpageInfo->SdrName,CPOffset);
  229. RegStrCpy(REGVAL_FULLNAME,JobParams->SenderName,JobOffset);
  230. RegStrCpy(REGVAL_COMPANY,CoverpageInfo->SdrCompany,CPOffset);
  231. RegStrCpy(REGVAL_COMPANY,JobParams->SenderCompany,JobOffset);
  232. RegStrCpy(REGVAL_DEPT,CoverpageInfo->SdrDepartment,CPOffset);
  233. RegStrCpy(REGVAL_DEPT,JobParams->SenderDept,JobOffset);
  234. RegStrCpy(REGVAL_FAX_NUMBER,CoverpageInfo->SdrFaxNumber,CPOffset);
  235. RegStrCpy(REGVAL_FAX_NUMBER,JobParams->Tsid,JobOffset);
  236. RegStrCpy(REGVAL_ADDRESS,CoverpageInfo->SdrAddress,CPOffset);
  237. RegStrCpy(REGVAL_TITLE,CoverpageInfo->SdrTitle,CPOffset);
  238. RegStrCpy(REGVAL_OFFICE,CoverpageInfo->SdrOfficeLocation,CPOffset);
  239. RegStrCpy(REGVAL_HOME_PHONE,CoverpageInfo->SdrHomePhone,CPOffset);
  240. RegStrCpy(REGVAL_OFFICE_PHONE,CoverpageInfo->SdrOfficePhone,CPOffset);
  241. RegStrCpy(REGVAL_BILLING_CODE,JobParams->BillingCode,CPOffset);
  242. RegStrCpy(REGVAL_MAILBOX,JobParams->DeliveryReportAddress,CPOffset);
  243. }
  244. *JobParamsBuffer = (PFAX_JOB_PARAMW)JobParams;
  245. *CoverpageInfoBuffer = (PFAX_COVERPAGE_INFOW) CoverpageInfo;
  246. fSuccess = TRUE;
  247. RegCloseKey(hKey);
  248. return fSuccess;
  249. }
  250. BOOL
  251. IsLocalFaxConnection(
  252. HANDLE FaxHandle
  253. )
  254. {
  255. DEBUG_FUNCTION_NAME(TEXT("IsLocalFaxConnection"));
  256. if (!FaxHandle)
  257. {
  258. DebugPrintEx(DEBUG_ERR, TEXT("FaxHandle is NULL."));
  259. SetLastError( ERROR_INVALID_HANDLE );
  260. return FALSE;
  261. }
  262. return IsLocalMachineName (FH_DATA(FaxHandle)->MachineName);
  263. } // IsLocalFaxConnection