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.

611 lines
16 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Copyright (c) 1997-1999 Microsoft Corporation
  4. //
  5. // File: policy.h
  6. //
  7. // Contents:
  8. //
  9. // History:
  10. //
  11. //---------------------------------------------------------------------------
  12. #ifndef __POLICY_MODULE_MGR__
  13. #define __POLICY_MODULE_MGR__
  14. #include "tlsstl.h" // STL.
  15. #include <stdio.h>
  16. #include <tchar.h>
  17. #include "tlsdef.h"
  18. #include "tlspol.h"
  19. #include "locks.h"
  20. #define RETURNLICENSEPROCNAME "PMReturnLicense"
  21. #define LICENSEUPGRADEPROCNAME "PMLicenseUpgrade"
  22. #define LICENSEREQUESTPROCNAME "PMLicenseRequest"
  23. #define TEMINATEPROCNAME "PMTerminate"
  24. #define INITIALIZEPROCNAME "PMInitialize"
  25. #define SUPPORTEDPRODUCTPROCNAME "PMInitializeProduct"
  26. #define ULOADPRODUCTPROCNAME "PMUnloadProduct"
  27. #define REGISTERLKPPROCNAME "PMRegisterLicensePack"
  28. #define POLICY_DENY_ALL_REQUEST 0x00000000
  29. #define POLICY_USE_DEFAULT 0x00000001
  30. typedef POLICYSTATUS (WINAPI *TLSPMReturnLicense)(
  31. PMHANDLE hClient,
  32. ULARGE_INTEGER* pLicenseSerialNumber,
  33. PPMLICENSETOBERETURN pLicenseToBeReturn,
  34. PDWORD pdwLicenseStatus,
  35. PDWORD pdwRetCode
  36. );
  37. typedef POLICYSTATUS (WINAPI *TLSPMLicenseUpgrade)(
  38. PMHANDLE hClient,
  39. DWORD dwProgressCode,
  40. PVOID pbProgressData,
  41. PVOID* ppbReturnData,
  42. PDWORD pdwRetCode,
  43. DWORD dwIndex
  44. );
  45. typedef POLICYSTATUS (WINAPI *TLSPMLicenseRequest)(
  46. PMHANDLE client,
  47. DWORD dwProgressCode,
  48. PVOID pbProgressData,
  49. PVOID* pbNewProgressData,
  50. PDWORD pdwRetCode
  51. );
  52. typedef void (WINAPI *TLSPMTerminate)();
  53. typedef POLICYSTATUS (WINAPI* TLSPMInitialize)(
  54. DWORD dwLicenseServerVersion,
  55. LPCTSTR pszCompanyName,
  56. LPCTSTR pszProductCode,
  57. PDWORD pdwNumProduct,
  58. PPMSUPPORTEDPRODUCT* ppProduct,
  59. PDWORD pdwRetCode
  60. );
  61. typedef POLICYSTATUS (WINAPI* TLSPMInitializeProduct)(
  62. LPCTSTR pszCompanyName,
  63. LPCTSTR pszCHProductId,
  64. LPCTSTR pszTLSProductId,
  65. PDWORD pdwRetCode
  66. );
  67. typedef POLICYSTATUS (WINAPI* TLSPMUnloadProduct)(
  68. LPCTSTR pszCompanyName,
  69. LPCTSTR pszCHProductId,
  70. LPCTSTR pszTLSProductCode,
  71. PDWORD pdwRetCode
  72. );
  73. typedef POLICYSTATUS (WINAPI* TLSPMRegisterLicensePack)(
  74. PMHANDLE hClient,
  75. DWORD dwProgressCode,
  76. PVOID pbProgressData,
  77. PVOID pbProgressRetData,
  78. PDWORD pdwRetCode
  79. );
  80. class CTLSPolicyMgr;
  81. ////////////////////////////////////////////////////////////////////////////
  82. class CTLSPolicy {
  83. friend class CTLSPolicyMgr;
  84. private:
  85. typedef enum {
  86. MODULE_UNKNOWN, // object has been initialized.
  87. MODULE_LOADED, // module has been loaded.
  88. MODULE_PMINITALIZED, // module has been initialized.
  89. MODULE_PMTERMINATED, // module has been terminated.
  90. MODULE_ERROR, // module initialization error or
  91. // cause an exeption
  92. MODULE_UNLOADED // module has been unloaded.
  93. } MODULE_STATE;
  94. long m_RefCount;
  95. DWORD m_dwFlags;
  96. BOOL m_bAlreadyLogError;
  97. POLICYSTATUS m_dwLastCallStatus; // Policy Module last call status
  98. DWORD m_dwPolicyErrCode; // Policy specific error code.
  99. MODULE_STATE m_dwModuleState;
  100. //
  101. // Policy module must be multi-thread safe.
  102. //
  103. TLSPMReturnLicense m_pfnReturnLicense;
  104. TLSPMLicenseUpgrade m_pfnLicenseUpgrade;
  105. TLSPMLicenseRequest m_pfnLicenseRequest;
  106. TLSPMUnloadProduct m_pfnUnloadProduct;
  107. TLSPMInitializeProduct m_pfnInitProduct;
  108. TLSPMRegisterLicensePack m_pfnRegisterLkp;
  109. HMODULE m_hPolicyModule;
  110. TCHAR m_szCompanyName[LSERVER_MAX_STRING_SIZE+1];
  111. TCHAR m_szProductId[LSERVER_MAX_STRING_SIZE+1];
  112. TCHAR m_szCHProductId[LSERVER_MAX_STRING_SIZE+1];
  113. //--------------------------------------------------------------
  114. void
  115. SetDllFlags(DWORD dllFlags)
  116. {
  117. m_dwFlags = dllFlags;
  118. }
  119. //--------------------------------------------------------------
  120. long
  121. Acquire()
  122. {
  123. return InterlockedIncrement(&m_RefCount);
  124. }
  125. //--------------------------------------------------------------
  126. long
  127. Release()
  128. {
  129. return InterlockedDecrement(&m_RefCount);
  130. }
  131. //--------------------------------------------------------------
  132. DWORD
  133. InitializePolicyModule();
  134. //--------------------------------------------------------------
  135. void
  136. SetModuleState(
  137. MODULE_STATE state
  138. )
  139. /*++
  140. ++*/
  141. {
  142. m_dwModuleState = state;
  143. return;
  144. }
  145. //-------------------------------------------------------------
  146. MODULE_STATE
  147. GetModuleState()
  148. {
  149. return m_dwModuleState;
  150. }
  151. //-------------------------------------------------------------
  152. void
  153. CreatePolicy(
  154. HMODULE hModule,
  155. LPCTSTR pszCompanyName,
  156. LPCTSTR pszProductId,
  157. TLSPMReturnLicense pfnReturnLicense,
  158. TLSPMLicenseUpgrade pfnLicenseUpgrade,
  159. TLSPMLicenseRequest pfnLicenseRequest,
  160. TLSPMUnloadProduct pfnUnloadProduct,
  161. TLSPMInitializeProduct pfnInitProduct,
  162. TLSPMRegisterLicensePack pfnRegisterLkp
  163. )
  164. /*++
  165. ++*/
  166. {
  167. m_hPolicyModule = hModule;
  168. m_pfnReturnLicense = pfnReturnLicense;
  169. m_pfnLicenseUpgrade = pfnLicenseUpgrade;
  170. m_pfnLicenseRequest = pfnLicenseRequest;
  171. m_pfnUnloadProduct = pfnUnloadProduct;
  172. m_pfnInitProduct = pfnInitProduct;
  173. m_pfnRegisterLkp = pfnRegisterLkp;
  174. SetModuleState(MODULE_PMINITALIZED);
  175. lstrcpyn(
  176. m_szCompanyName,
  177. pszCompanyName,
  178. sizeof(m_szCompanyName) / sizeof(m_szCompanyName[0])
  179. );
  180. lstrcpyn(
  181. m_szProductId,
  182. pszProductId,
  183. sizeof(m_szProductId) / sizeof(m_szProductId[0])
  184. );
  185. }
  186. void
  187. LogPolicyRequestStatus(
  188. DWORD dwMsgId
  189. );
  190. public:
  191. CTLSPolicy() :
  192. m_pfnReturnLicense(NULL),
  193. m_pfnLicenseUpgrade(NULL),
  194. m_pfnLicenseRequest(NULL),
  195. m_pfnUnloadProduct(NULL),
  196. m_pfnInitProduct(NULL),
  197. m_pfnRegisterLkp(NULL),
  198. m_hPolicyModule(NULL),
  199. m_RefCount(0),
  200. m_bAlreadyLogError(FALSE),
  201. m_dwModuleState(MODULE_UNKNOWN),
  202. m_dwFlags(0),
  203. m_dwLastCallStatus(POLICY_SUCCESS),
  204. m_dwPolicyErrCode(ERROR_SUCCESS)
  205. /*++
  206. Constructor
  207. ++*/
  208. {
  209. #ifdef DBG
  210. memset(m_szCompanyName, 0, sizeof(m_szCompanyName));
  211. memset(m_szProductId, 0, sizeof(m_szProductId));
  212. memset(m_szCHProductId, 0, sizeof(m_szCHProductId));
  213. #endif
  214. }
  215. //--------------------------------------------------------------
  216. ~CTLSPolicy()
  217. /*++
  218. Destructor
  219. ++*/
  220. {
  221. Unload();
  222. }
  223. //--------------------------------------------------------------
  224. DWORD
  225. GetProductFlags()
  226. {
  227. return m_dwFlags;
  228. }
  229. //--------------------------------------------------------------
  230. long
  231. GetRefCount()
  232. {
  233. return InterlockedExchange(&m_RefCount, m_RefCount);
  234. }
  235. //--------------------------------------------------------------
  236. void
  237. Unload();
  238. //--------------------------------------------------------------
  239. DWORD
  240. Initialize(
  241. HINSTANCE hInstance,
  242. LPCTSTR pszCompanyName,
  243. LPCTSTR pszCHProductId,
  244. LPCTSTR pszProductId,
  245. LPCTSTR pszDllName,
  246. DWORD dwDllFlag = POLICY_DENY_ALL_REQUEST
  247. );
  248. //--------------------------------------------------------------
  249. LPCTSTR
  250. GetCompanyName()
  251. {
  252. return m_szCompanyName;
  253. }
  254. //--------------------------------------------------------------
  255. LPCTSTR
  256. GetProductId()
  257. {
  258. return m_szProductId;
  259. }
  260. //--------------------------------------------------------------
  261. LPCTSTR
  262. GetCHProductId()
  263. {
  264. return m_szCHProductId;
  265. }
  266. //--------------------------------------------------------------
  267. DWORD
  268. GetPolicyRetCode() { return m_dwPolicyErrCode; }
  269. //--------------------------------------------------------------
  270. DWORD
  271. GetPolicyLastCallStatus() { return m_dwLastCallStatus; }
  272. //--------------------------------------------------------------
  273. BOOL
  274. IsValid();
  275. //--------------------------------------------------------------
  276. DWORD
  277. PMReturnLicense(
  278. PMHANDLE hClient,
  279. ULARGE_INTEGER* pLicenseSerialNumber,
  280. PPMLICENSETOBERETURN pLicenseTobeReturn,
  281. PDWORD pdwLicenseStatus
  282. );
  283. //--------------------------------------------------------------
  284. DWORD
  285. PMLicenseUpgrade(
  286. PMHANDLE hClient,
  287. DWORD dwProgressCode,
  288. PVOID pbProgressData,
  289. PVOID* ppbReturnData,
  290. DWORD dwIndex
  291. );
  292. //--------------------------------------------------------------
  293. DWORD
  294. PMLicenseRequest(
  295. PMHANDLE client,
  296. DWORD dwProgressCode,
  297. const PVOID pbProgressData,
  298. PVOID* pbNewProgressData
  299. );
  300. //--------------------------------------------------------------
  301. DWORD
  302. PMRegisterLicensePack(
  303. PMHANDLE hClient,
  304. DWORD dwProgressCode,
  305. const PVOID pbProgessData,
  306. PVOID pbProgressRetData
  307. );
  308. //--------------------------------------------------------------
  309. DWORD
  310. PMUnload();
  311. //--------------------------------------------------------------
  312. DWORD
  313. PMInitProduct();
  314. };
  315. /////////////////////////////////////////////////////////////////////
  316. typedef struct __PolicyModule {
  317. TCHAR m_szCompanyName[LSERVER_MAX_STRING_SIZE+1];
  318. TCHAR m_szProductId[LSERVER_MAX_STRING_SIZE+1];
  319. friend bool operator<(const __PolicyModule&, const __PolicyModule&);
  320. __PolicyModule()
  321. {
  322. memset(m_szCompanyName, 0, sizeof(m_szCompanyName));
  323. memset(m_szProductId, 0, sizeof(m_szProductId));
  324. }
  325. } PolicyModule;
  326. inline bool
  327. operator<(
  328. const PolicyModule& a,
  329. const PolicyModule& b
  330. )
  331. /*++
  332. ++*/
  333. {
  334. int iComp;
  335. iComp = _tcsicmp(a.m_szCompanyName, b.m_szCompanyName);
  336. if(iComp == 0)
  337. {
  338. iComp = _tcsicmp(a.m_szProductId, b.m_szProductId);
  339. }
  340. return iComp < 0;
  341. }
  342. //////////////////////////////////////////////////////////
  343. //
  344. // CTLSPolicyMgr must be a global object so destructor is
  345. // invoked at the end.
  346. //
  347. class CTLSPolicyMgr {
  348. private:
  349. typedef map<PolicyModule, HMODULE, less<PolicyModule> > PMLoadedModuleMapType;
  350. typedef map<PolicyModule, CTLSPolicy*, less<PolicyModule> > PMProductPolicyMapType;
  351. typedef map<PolicyModule, PolicyModule, less<PolicyModule> > PMProductTransationMapType;
  352. //
  353. // Policy module per product
  354. //
  355. CRWLock m_ProductPolicyModuleRWLock;
  356. PMProductPolicyMapType m_ProductPolicyModule;
  357. //
  358. // List of loaded policy module
  359. //
  360. CRWLock m_LoadedPolicyRWLock;
  361. PMLoadedModuleMapType m_LoadedPolicy;
  362. //
  363. // List of Product transation
  364. //
  365. CRWLock m_ProductTranslationRWLock;
  366. PMProductTransationMapType m_ProductTranslation;
  367. HMODULE
  368. LoadPolicyModule(
  369. LPCTSTR pszCompanyName,
  370. LPCTSTR pszProductCode,
  371. LPCTSTR pszDllName
  372. );
  373. //
  374. // Find policy module handle for a particular product
  375. //
  376. PMProductPolicyMapType::iterator
  377. FindProductPolicyModule(
  378. LPCTSTR pszCompanyName,
  379. LPCTSTR pszProductId
  380. );
  381. //
  382. // Find policy module handle for a particular product
  383. //
  384. PMProductTransationMapType::iterator
  385. FindProductTransation(
  386. LPCTSTR pszCompanyName,
  387. LPCTSTR pszCHProductCode
  388. );
  389. void
  390. InsertProductTransation(
  391. LPCTSTR pszCompanyName,
  392. LPCTSTR pszCHProductCode,
  393. LPCTSTR pszTLSProductCode
  394. );
  395. DWORD
  396. GetSupportedProduct(
  397. HMODULE hModule,
  398. LPCTSTR pszDllName,
  399. LPCTSTR pszCompanyName,
  400. LPCTSTR pszProductId,
  401. PDWORD pdwNumProducts,
  402. PPMSUPPORTEDPRODUCT* pSupportedProduct
  403. );
  404. DWORD
  405. InsertProductPolicyModule(
  406. HMODULE hModule,
  407. BOOL bReplace,
  408. LPCTSTR pszCompanyName,
  409. LPCTSTR pszCHProductId,
  410. LPCTSTR pszTLSProductId,
  411. LPCTSTR pszDllName,
  412. DWORD dwFlag
  413. );
  414. DWORD
  415. UnloadPolicyModule(
  416. HINSTANCE hModule
  417. );
  418. public:
  419. CTLSPolicyMgr();
  420. ~CTLSPolicyMgr();
  421. //
  422. // Insert a policy module handle into Handle arrays.
  423. //
  424. DWORD
  425. AddPolicyModule(
  426. BOOL bReplace,
  427. LPCTSTR pszCompanyName,
  428. LPCTSTR pszProductId,
  429. LPCTSTR pszDllName,
  430. DWORD dwFlag
  431. );
  432. DWORD
  433. UnloadPolicyModule(
  434. LPCTSTR pszCompanyName,
  435. LPCTSTR pszProductCode
  436. );
  437. //
  438. // Find a policy module for specific product
  439. //
  440. CTLSPolicy*
  441. AcquireProductPolicyModule(
  442. LPCTSTR pszCompanyName,
  443. LPCTSTR pszProductId
  444. );
  445. //
  446. // Find a translation for CH.
  447. //
  448. BOOL
  449. TranslateCHCodeToTlsCode(
  450. LPCTSTR pszCompanyName,
  451. LPCTSTR pszCHProductCode,
  452. LPTSTR pszTlsProductCode,
  453. PDWORD pdwBufferSize
  454. );
  455. //
  456. // Release a product policy module
  457. //
  458. void
  459. ReleaseProductPolicyModule( CTLSPolicy* p );
  460. //
  461. // Initialize All Product Policy Module
  462. //
  463. DWORD
  464. InitProductPolicyModule();
  465. };
  466. #ifdef __cplusplus
  467. extern "C" {
  468. #endif
  469. DWORD
  470. ServiceInitPolicyModule(void);
  471. DWORD
  472. ServiceLoadAllPolicyModule(
  473. IN HKEY hRoot,
  474. IN LPCTSTR pszSubkey
  475. );
  476. CTLSPolicy*
  477. AcquirePolicyModule(
  478. IN LPCTSTR pszCompanyName,
  479. IN LPCTSTR pszProductId,
  480. IN BOOL bUseProductPolicy
  481. );
  482. BOOL
  483. TranslateCHCodeToTlsCode(
  484. IN LPCTSTR pszCompanyName,
  485. IN LPCTSTR pszCHProductId,
  486. IN LPTSTR pszTLSProductId,
  487. IN OUT PDWORD pdwBufferSize
  488. );
  489. void
  490. ReleasePolicyModule(
  491. CTLSPolicy* ptr
  492. );
  493. #ifdef __cplusplus
  494. }
  495. #endif
  496. #endif