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.

521 lines
12 KiB

  1. /*******************************************************************************
  2. *
  3. * (C) COPYRIGHT MICROSOFT CORP., 2001
  4. *
  5. * TITLE: wiacam.cpp
  6. *
  7. * VERSION: 1.0
  8. *
  9. * DATE: 15 Nov, 2000
  10. *
  11. * DESCRIPTION:
  12. * Implementation of the WIA File System Device driver Class Factory and IUNKNOWN interface.
  13. *
  14. *******************************************************************************/
  15. #include "pch.h"
  16. #if !defined(dllexp)
  17. #define DLLEXPORT __declspec( dllexport )
  18. #endif
  19. /*****************************************************************************
  20. *
  21. * Globals
  22. *
  23. *****************************************************************************/
  24. DWORD g_cRef; // USD reference counter.
  25. HINSTANCE g_hInst; // DLL module instance.
  26. // IWiaLog *g_pIWiaLog = NULL; // WIA Logging Interface
  27. // Is COM initialized
  28. BOOL g_COMInitialized = FALSE;
  29. /**************************************************************************\
  30. * DllAddRef
  31. *
  32. *
  33. *
  34. * Arguments:
  35. *
  36. * None
  37. *
  38. \**************************************************************************/
  39. void DllAddRef(void)
  40. {
  41. InterlockedIncrement((LPLONG)&g_cRef);
  42. }
  43. /**************************************************************************\
  44. * DllRelease
  45. *
  46. *
  47. *
  48. * Arguments:
  49. *
  50. * None
  51. *
  52. \**************************************************************************/
  53. void DllRelease(void)
  54. {
  55. InterlockedDecrement((LPLONG)&g_cRef);
  56. }
  57. /**************************************************************************\
  58. * DllInitializeCOM
  59. *
  60. *
  61. *
  62. * Arguments:
  63. *
  64. * None
  65. *
  66. \**************************************************************************/
  67. BOOL DllInitializeCOM(void)
  68. {
  69. if (!g_COMInitialized) {
  70. if(SUCCEEDED(CoInitialize(NULL))) {
  71. g_COMInitialized = TRUE;
  72. }
  73. }
  74. return g_COMInitialized;
  75. }
  76. /**************************************************************************\
  77. * DllUnInitializeCOM
  78. *
  79. *
  80. *
  81. * Arguments:
  82. *
  83. * None
  84. *
  85. \**************************************************************************/
  86. BOOL DllUnInitializeCOM(void)
  87. {
  88. if(g_COMInitialized) {
  89. CoUninitialize();
  90. g_COMInitialized = FALSE;
  91. }
  92. return TRUE;
  93. }
  94. /**************************************************************************\
  95. * CWiaCameraDeviceClassFactory::CWiaCameraDeviceClassFactory(void)
  96. *
  97. *
  98. *
  99. * Arguments:
  100. *
  101. * None
  102. *
  103. \**************************************************************************/
  104. CWiaCameraDeviceClassFactory::CWiaCameraDeviceClassFactory(void)
  105. {
  106. // Constructor logic
  107. m_cRef = 0;
  108. // WIAS_LTRACE(g_pIWiaLog,
  109. // WIALOG_NO_RESOURCE_ID,
  110. // WIALOG_LEVEL3,
  111. // ("CWiaCameraDeviceClassFactory::CWiaCameraDeviceClassFactory, (creating)"));
  112. }
  113. /**************************************************************************\
  114. * CWiaCameraDeviceClassFactory::~CWiaCameraDeviceClassFactory(void)
  115. *
  116. *
  117. *
  118. * Arguments:
  119. *
  120. * None
  121. *
  122. \**************************************************************************/
  123. CWiaCameraDeviceClassFactory::~CWiaCameraDeviceClassFactory(void)
  124. {
  125. // Destructor logic
  126. // WIAS_LTRACE(g_pIWiaLog,
  127. // WIALOG_NO_RESOURCE_ID,
  128. // WIALOG_LEVEL3,
  129. // ("CWiaCameraDeviceClassFactory::CWiaCameraDeviceClassFactory, (destroy)"));
  130. // WIA_DEBUG_DESTROY();
  131. }
  132. /**************************************************************************\
  133. * CWiaCameraDeviceClassFactory::QueryInterface
  134. *
  135. *
  136. *
  137. * Arguments:
  138. *
  139. * riid -
  140. * ppvObject -
  141. *
  142. \**************************************************************************/
  143. STDMETHODIMP CWiaCameraDeviceClassFactory::QueryInterface(
  144. REFIID riid,
  145. void __RPC_FAR *__RPC_FAR *ppvObject)
  146. {
  147. *ppvObject = NULL;
  148. if (IsEqualIID(riid, IID_IUnknown) ||
  149. IsEqualIID(riid, IID_IClassFactory)) {
  150. *ppvObject = (LPVOID)this;
  151. AddRef();
  152. return NOERROR;
  153. }
  154. return ResultFromScode(E_NOINTERFACE);
  155. }
  156. /**************************************************************************\
  157. * CWiaCameraDeviceClassFactory::AddRef
  158. *
  159. *
  160. *
  161. * Arguments:
  162. *
  163. * None
  164. *
  165. \**************************************************************************/
  166. STDMETHODIMP_(ULONG) CWiaCameraDeviceClassFactory::AddRef(void)
  167. {
  168. DllAddRef();
  169. return ++m_cRef;
  170. }
  171. /**************************************************************************\
  172. * CWiaCameraDeviceClassFactory::Release
  173. *
  174. *
  175. *
  176. * Arguments:
  177. *
  178. * None
  179. *
  180. \**************************************************************************/
  181. STDMETHODIMP_(ULONG) CWiaCameraDeviceClassFactory::Release(void)
  182. {
  183. DllRelease();
  184. if (--m_cRef == 0) {
  185. delete this;
  186. return 0;
  187. }
  188. return m_cRef;
  189. }
  190. /**************************************************************************\
  191. * CWiaCameraDeviceClassFactory::CreateInstance
  192. *
  193. *
  194. *
  195. * Arguments:
  196. *
  197. * punkOuter -
  198. * riid, -
  199. * ppvObject -
  200. *
  201. \**************************************************************************/
  202. STDMETHODIMP CWiaCameraDeviceClassFactory::CreateInstance(
  203. IUnknown __RPC_FAR *punkOuter,
  204. REFIID riid,
  205. void __RPC_FAR *__RPC_FAR *ppvObject)
  206. {
  207. if (!IsEqualIID(riid, IID_IStiUSD) &&
  208. !IsEqualIID(riid, IID_IUnknown)) {
  209. return STIERR_NOINTERFACE;
  210. }
  211. // When created for aggregation, only IUnknown can be requested.
  212. if (punkOuter && !IsEqualIID(riid, IID_IUnknown)) {
  213. return CLASS_E_NOAGGREGATION;
  214. }
  215. CWiaCameraDevice *pDev = NULL;
  216. HRESULT hres;
  217. pDev = new CWiaCameraDevice(punkOuter);
  218. if (!pDev) {
  219. return STIERR_OUTOFMEMORY;
  220. }
  221. // Move to the requested interface if we aren't aggregated.
  222. // Don't do this if aggregated, or we will lose the private
  223. // IUnknown and then the caller will be hosed.
  224. hres = pDev->NonDelegatingQueryInterface(riid,ppvObject);
  225. pDev->NonDelegatingRelease();
  226. return hres;
  227. }
  228. /**************************************************************************\
  229. * CWiaCameraDeviceClassFactory::LockServer
  230. *
  231. *
  232. *
  233. * Arguments:
  234. *
  235. * None
  236. *
  237. \**************************************************************************/
  238. STDMETHODIMP CWiaCameraDeviceClassFactory::LockServer(BOOL fLock)
  239. {
  240. if (fLock) {
  241. DllAddRef();
  242. } else {
  243. DllRelease();
  244. }
  245. return NOERROR;
  246. }
  247. /**************************************************************************\
  248. * CWiaCameraDevice::NonDelegatingQueryInterface
  249. *
  250. *
  251. *
  252. * Arguments:
  253. *
  254. * None
  255. *
  256. \**************************************************************************/
  257. STDMETHODIMP CWiaCameraDevice::NonDelegatingQueryInterface(
  258. REFIID riid,
  259. LPVOID *ppvObj)
  260. {
  261. HRESULT hres = S_OK;
  262. if (!ppvObj) {
  263. return STIERR_INVALID_PARAM;
  264. }
  265. *ppvObj = NULL;
  266. if (IsEqualIID( riid, IID_IUnknown )) {
  267. *ppvObj = static_cast<INonDelegatingUnknown*>(this);
  268. }
  269. else if (IsEqualIID( riid, IID_IStiUSD )) {
  270. *ppvObj = static_cast<IStiUSD*>(this);
  271. }
  272. else if (IsEqualIID( riid, IID_IWiaMiniDrv )) {
  273. *ppvObj = static_cast<IWiaMiniDrv*>(this);
  274. }
  275. else {
  276. hres = STIERR_NOINTERFACE;
  277. }
  278. if (SUCCEEDED(hres)) {
  279. (reinterpret_cast<IUnknown*>(*ppvObj))->AddRef();
  280. }
  281. return hres;
  282. }
  283. /**************************************************************************\
  284. * CWiaCameraDevice::NonDelegatingAddRef
  285. *
  286. *
  287. *
  288. * Arguments:
  289. *
  290. * None
  291. *
  292. \**************************************************************************/
  293. STDMETHODIMP_(ULONG) CWiaCameraDevice::NonDelegatingAddRef(void)
  294. {
  295. return InterlockedIncrement((LPLONG)&m_cRef);
  296. }
  297. /**************************************************************************\
  298. * CWiaCameraDevice::NonDelegatingRelease
  299. *
  300. *
  301. *
  302. * Arguments:
  303. *
  304. * None
  305. *
  306. \**************************************************************************/
  307. STDMETHODIMP_(ULONG) CWiaCameraDevice::NonDelegatingRelease(void)
  308. {
  309. ULONG ulRef;
  310. ulRef = InterlockedDecrement((LPLONG)&m_cRef);
  311. if (!ulRef) {
  312. delete this;
  313. }
  314. return ulRef;
  315. }
  316. /**************************************************************************\
  317. * CWiaCameraDevice::QueryInterface
  318. *
  319. *
  320. *
  321. * Arguments:
  322. *
  323. * None
  324. *
  325. \**************************************************************************/
  326. STDMETHODIMP CWiaCameraDevice::QueryInterface(REFIID riid, LPVOID* ppvObj)
  327. {
  328. return m_punkOuter->QueryInterface(riid,ppvObj);
  329. }
  330. /**************************************************************************\
  331. * CWiaCameraDevice::AddRef
  332. *
  333. *
  334. *
  335. * Arguments:
  336. *
  337. * None
  338. *
  339. \**************************************************************************/
  340. STDMETHODIMP_(ULONG) CWiaCameraDevice::AddRef(void)
  341. {
  342. return m_punkOuter->AddRef();
  343. }
  344. /**************************************************************************\
  345. * CWiaCameraDevice::Release
  346. *
  347. *
  348. *
  349. * Arguments:
  350. *
  351. * None
  352. *
  353. \**************************************************************************/
  354. STDMETHODIMP_(ULONG) CWiaCameraDevice::Release(void)
  355. {
  356. return m_punkOuter->Release();
  357. }
  358. /**************************************************************************\
  359. * DllEntryPoint
  360. *
  361. * Main library entry point. Receives DLL event notification from OS.
  362. *
  363. * We are not interested in thread attaches and detaches,
  364. * so we disable thread notifications for performance reasons.
  365. *
  366. * Arguments:
  367. *
  368. * hinst -
  369. * dwReason -
  370. * lpReserved -
  371. *
  372. * Return Value:
  373. *
  374. * Returns TRUE to allow the DLL to load.
  375. *
  376. \**************************************************************************/
  377. extern "C" DLLEXPORT BOOL APIENTRY DllEntryPoint(
  378. HINSTANCE hinst,
  379. DWORD dwReason,
  380. LPVOID lpReserved)
  381. {
  382. HRESULT hr = E_FAIL;
  383. switch (dwReason) {
  384. case DLL_PROCESS_ATTACH:
  385. g_hInst = hinst;
  386. // DBG_INIT(hinst);
  387. DisableThreadLibraryCalls(hinst);
  388. // if( ERROR_SUCCESS != PopulateFormatInfo() )
  389. // return FALSE;
  390. break;
  391. case DLL_PROCESS_DETACH:
  392. if (g_cRef) {
  393. }
  394. // UnPopulateFormatInfo();
  395. break;
  396. }
  397. return TRUE;
  398. }
  399. /**************************************************************************\
  400. * DllCanUnloadNow
  401. *
  402. * Determines whether the DLL has any outstanding interfaces.
  403. *
  404. * Arguments:
  405. *
  406. * None
  407. *
  408. * Return Value:
  409. *
  410. * Returns S_OK if the DLL can unload, S_FALSE if it is not safe to unload.
  411. *
  412. \**************************************************************************/
  413. extern "C" STDMETHODIMP DllCanUnloadNow(void)
  414. {
  415. return g_cRef ? S_FALSE : S_OK;
  416. }
  417. /**************************************************************************\
  418. * DllGetClassObject
  419. *
  420. * Create an IClassFactory instance for this DLL. We support only one
  421. * class of objects, so this function does not need to go through a table
  422. * of supported classes, looking for the proper constructor.
  423. *
  424. * Arguments:
  425. *
  426. * rclsid - The object being requested.
  427. * riid - The desired interface on the object.
  428. * ppv - Output pointer to object.
  429. *
  430. \**************************************************************************/
  431. extern "C" STDAPI DllGetClassObject(
  432. REFCLSID rclsid,
  433. REFIID riid,
  434. LPVOID *ppv)
  435. {
  436. if (!ppv) {
  437. return ResultFromScode(E_FAIL);
  438. }
  439. if (!IsEqualCLSID(rclsid, CLSID_FSUsd) ) {
  440. return ResultFromScode(E_FAIL);
  441. }
  442. if (!IsEqualIID(riid, IID_IUnknown) &&
  443. !IsEqualIID(riid, IID_IClassFactory)) {
  444. return ResultFromScode(E_NOINTERFACE);
  445. }
  446. if (IsEqualCLSID(rclsid, CLSID_FSUsd)) {
  447. CWiaCameraDeviceClassFactory *pcf = new CWiaCameraDeviceClassFactory;
  448. if (pcf) {
  449. *ppv = (LPVOID)pcf;
  450. }
  451. }
  452. return NOERROR;
  453. }