ntdll: Implemented IOCTL purge for serial objects.
[wine] / dlls / dxdiagn / dxdiag_main.c
1 /* 
2  * DXDiag
3  * 
4  * Copyright 2004 Raphael Junqueira
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include "config.h"
23 #include "dxdiag_private.h"
24 #include "wine/debug.h"
25
26 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
27
28 LONG DXDIAGN_refCount = 0;
29
30 /* At process attach */
31 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
32 {
33   TRACE("%p,%lx,%p\n", hInstDLL, fdwReason, lpvReserved);
34   if (fdwReason == DLL_PROCESS_ATTACH) {
35     DisableThreadLibraryCalls(hInstDLL);    
36   }
37   return TRUE;
38 }
39
40 /*******************************************************************************
41  * DXDiag ClassFactory
42  */
43 typedef struct {
44   const IClassFactoryVtbl *lpVtbl;
45   REFCLSID   rclsid;
46   HRESULT   (*pfnCreateInstanceFactory)(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, REFIID riid, LPVOID *ppobj);
47 } IClassFactoryImpl;
48
49 static HRESULT WINAPI DXDiagCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
50   FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
51
52   if (ppobj == NULL) return E_POINTER;
53   
54   return E_NOINTERFACE;
55 }
56
57 static ULONG WINAPI DXDiagCF_AddRef(LPCLASSFACTORY iface) {
58   DXDIAGN_LockModule();
59
60   return 2; /* non-heap based object */
61 }
62
63 static ULONG WINAPI DXDiagCF_Release(LPCLASSFACTORY iface) {
64   DXDIAGN_UnlockModule();
65
66   return 1; /* non-heap based object */
67 }
68
69 static HRESULT WINAPI DXDiagCF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
70   IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
71   TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
72   
73   return This->pfnCreateInstanceFactory(iface, pOuter, riid, ppobj);
74 }
75
76 static HRESULT WINAPI DXDiagCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
77   TRACE("(%d)\n", dolock);
78
79   if (dolock)
80     DXDIAGN_LockModule();
81   else
82     DXDIAGN_UnlockModule();
83   
84   return S_OK;
85 }
86
87 static const IClassFactoryVtbl DXDiagCF_Vtbl = {
88   DXDiagCF_QueryInterface,
89   DXDiagCF_AddRef,
90   DXDiagCF_Release,
91   DXDiagCF_CreateInstance,
92   DXDiagCF_LockServer
93 };
94
95 static IClassFactoryImpl DXDiag_CFS[] = {
96   { &DXDiagCF_Vtbl, &CLSID_DxDiagProvider, DXDiag_CreateDXDiagProvider },
97   { NULL, NULL, NULL }
98 };
99
100 /***********************************************************************
101  *             DllCanUnloadNow (DXDIAGN.@)
102  */
103 HRESULT WINAPI DllCanUnloadNow(void)
104 {
105   return DXDIAGN_refCount != 0 ? S_FALSE : S_OK;
106 }
107
108 /***********************************************************************
109  *              DllGetClassObject (DXDIAGN.@)
110  */
111 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
112 {
113     int i = 0;
114
115     TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
116     while (NULL != DXDiag_CFS[i].rclsid) {
117       if (IsEqualGUID(rclsid, DXDiag_CFS[i].rclsid)) {
118               DXDiagCF_AddRef((IClassFactory*) &DXDiag_CFS[i]);
119               *ppv = &DXDiag_CFS[i];
120               return S_OK;
121       }
122       ++i;
123     }
124
125     FIXME("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
126     return CLASS_E_CLASSNOTAVAILABLE;
127 }