ReactOS 0.4.15-dev-7906-g1b85a5f
adapter.cpp
Go to the documentation of this file.
1/*
2Copyright (c) 2006-2008 dogbert <dogber1@gmail.com>
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions
7are met:
81. Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
102. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
133. The name of the author may not be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#define PUT_GUIDS_HERE
29
30#include "adapter.hpp"
31
32#ifdef _MSC_VER
33#pragma code_seg("PAGE")
34#endif
35
36static
38InstallSubdevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PWCHAR Name, REFGUID PortClassId, REFGUID MiniportClassId, PFNCREATEINSTANCE MiniportCreate, PUNKNOWN UnknownAdapter, PRESOURCELIST ResourceList, REFGUID PortInterfaceId, PUNKNOWN* OutPortUnknown)
39{
40 PAGED_CODE();
41 DBGPRINT(("InstallSubdevice()"));
42
43 NTSTATUS ntStatus;
44 PPORT Port;
45 PMINIPORT MiniPort;
46
47 ntStatus = PcNewPort(&Port, PortClassId);
48 if (NT_SUCCESS(ntStatus)) {
49 if (MiniportCreate) {
50 ntStatus = MiniportCreate((PUNKNOWN*)&MiniPort, MiniportClassId, NULL, NonPagedPool);
51 } else {
52 ntStatus = PcNewMiniport(&MiniPort, MiniportClassId);
53 }
54 }
55
56 if (!NT_SUCCESS(ntStatus)) {
57 Port->Release();
58 return ntStatus;
59 }
60
61 ntStatus = Port->Init(DeviceObject, Irp, MiniPort, UnknownAdapter, ResourceList);
62 if (NT_SUCCESS(ntStatus)) {
64
65 if (OutPortUnknown && NT_SUCCESS (ntStatus)) {
66 ntStatus = Port->QueryInterface(IID_IUnknown, (PVOID *)OutPortUnknown);
67 }
68 }
69
70 if (MiniPort) {
71 MiniPort->Release();
72 }
73
74 if (Port) {
75 Port->Release();
76 }
77
78 return ntStatus;
79}
80
81static
84{
85 PAGED_CODE();
87 ASSERT(UartResourceList);
88 DBGPRINT(("ProcessResources()"));
89 DBGPRINT(("NumberOfPorts: %d, NumberOfInterrupts: %d, NumberOfDmas: %d", ResourceList->NumberOfPorts(), ResourceList->NumberOfInterrupts(), ResourceList->NumberOfDmas()));
90#ifdef UART
91 NTSTATUS ntStatus;
92
93 (*UartResourceList) = NULL;
94#endif
95
96 if ((ResourceList->NumberOfPorts() == 0) || (ResourceList->NumberOfPorts() > 2) || (ResourceList->NumberOfInterrupts() != 1) || (ResourceList->NumberOfDmas() != 0)) {
97 DBGPRINT(("Unexpected configuration"));
99 }
100
101#ifdef UART
102 ntStatus = PcNewResourceSublist(UartResourceList, NULL, PagedPool, ResourceList, 2);
103 if (NT_SUCCESS(ntStatus)) {
104 (*UartResourceList)->AddPortFromParent(ResourceList, 1);
105 (*UartResourceList)->AddInterruptFromParent(ResourceList, 0);
106 }
107#endif
108
109 return STATUS_SUCCESS;
110}
111
112
114NTAPI
116{
117 PAGED_CODE();
119 ASSERT(Irp);
121 DBGPRINT(("StartDevice()"));
122
123 NTSTATUS ntStatus;
124 PPORT pPort = 0;
125#ifdef UART
126 ULONG* MPUBase;
127#endif
128
129 ntStatus = PcNewPort(&pPort,CLSID_PortWaveCyclic);
130 if (NT_SUCCESS(ntStatus)) {
131 // not supported in the first edition of win98
132 PPORTEVENTS pPortEvents = 0;
133 ntStatus = pPort->QueryInterface(IID_IPortEvents, (PVOID *)&pPortEvents);
134 if (!NT_SUCCESS(ntStatus)) {
135 DBGPRINT(("ERROR: This driver doesn't work under Win98!"));
136 ntStatus = STATUS_UNSUCCESSFUL;
137 }
138 else
139 {
140 pPortEvents->Release();
141 }
142 pPort->Release ();
143 } else {
144 return ntStatus;
145 }
146
147 // resource validation
148 PRESOURCELIST UartResourceList = NULL;
149 ntStatus = ProcessResources(ResourceList, &UartResourceList);
150 if (!NT_SUCCESS(ntStatus)) {
151 DBGPRINT(("ProcessResources() failed"));
152 return ntStatus;
153 }
154
155 PCMIADAPTER pCMIAdapter = NULL;
156 PUNKNOWN pUnknownCommon = NULL;
157
158 // create the CMIAdapter object
159 ntStatus = NewCMIAdapter(&pUnknownCommon, IID_ICMIAdapter, NULL, NonPagedPool);
160 if (!NT_SUCCESS(ntStatus)) {
161 DBGPRINT(("NewCMIAdapter() failed"));
162 return ntStatus;
163 }
164
165 ntStatus = pUnknownCommon->QueryInterface(IID_ICMIAdapter, (PVOID *)&pCMIAdapter);
166 if (!NT_SUCCESS(ntStatus)) {
167 DBGPRINT(("QueryInterface() for ICMIAdapter failed"));
168 return ntStatus;
169 }
170 ntStatus = pCMIAdapter->init(ResourceList, DeviceObject);
171 if (!NT_SUCCESS(ntStatus)) {
172 DBGPRINT(("CMIAdapter->init() failed"));
173 return ntStatus;
174 }
175
177
178 pUnknownCommon->Release();
179
180 PUNKNOWN unknownWave = NULL;
181 PUNKNOWN unknownTopology = NULL;
182
183 // install the topology miniport.
184 ntStatus = InstallSubdevice(DeviceObject, Irp, L"Topology", CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyCMI, pCMIAdapter, NULL, GUID_NULL, &unknownTopology);
185 if (!NT_SUCCESS (ntStatus)) {
186 DBGPRINT(("Topology miniport installation failed"));
187 return ntStatus;
188 }
189
190#ifdef UART
191 // install the UART miniport - execution order important
192 ntStatus = STATUS_UNSUCCESSFUL;
193 MPUBase = 0;
194 for (int i=0;i<ResourceList->NumberOfPorts();i++) {
195 if (ResourceList->FindTranslatedPort(i)->u.Port.Length == 2) {
196 MPUBase = (UInt32*)ResourceList->FindTranslatedPort(i)->u.Port.Start.QuadPart;
197 }
198 }
199 if (MPUBase != 0) {
200 ntStatus = pCMIAdapter->activateMPU(MPUBase);
201 if (NT_SUCCESS(ntStatus)) {
202 ntStatus = InstallSubdevice(DeviceObject, Irp, L"Uart", CLSID_PortDMus, CLSID_MiniportDriverDMusUART, NULL, pCMIAdapter->getInterruptSync(), UartResourceList, IID_IPortDMus, NULL);
203 }
204 }
205 if (!NT_SUCCESS(ntStatus)) {
206 MPUBase = 0;
207 pCMIAdapter->activateMPU(0);
208 DBGPRINT(("UART miniport installation failed"));
209 }
210 if (UartResourceList) {
211 UartResourceList->Release();
212 }
213#endif
214
215 // install the wave miniport - the order matters here
216#ifdef WAVERT
217 ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveRT, CLSID_PortWaveRT, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveRT, &unknownWave);
218#else
219 ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveCyclic, &unknownWave);
220#endif
221 if (!NT_SUCCESS(ntStatus)) {
222 DBGPRINT(("Wave miniport installation failed"));
223 return ntStatus;
224 }
225
226 // connect wave and topology pins
228 if (!NT_SUCCESS(ntStatus)) {
229 DBGPRINT(("Cannot connect topology and wave miniport (render)!"));
230 return ntStatus;
231 }
232 ntStatus = PcRegisterPhysicalConnection(DeviceObject, unknownTopology, PIN_WAVEIN_DEST, unknownWave, PIN_WAVE_CAPTURE_SOURCE);
233 if (!NT_SUCCESS(ntStatus)) {
234 DBGPRINT(("Cannot connect topology and wave miniport (capture)!"));
235 return ntStatus;
236 }
237 if (!IoIsWdmVersionAvailable(6,0)) {
238 // this shit fixes the fucking XP mixer and breaks the vista mixer, so we have to check for vista here
240 if (!NT_SUCCESS(ntStatus)) {
241 DBGPRINT(("Cannot connect topology and wave miniport (ac3)!"));
242 }
243 }
244
245 // clean up
246 if (pCMIAdapter) {
247 pCMIAdapter->Release();
248 }
249 if (unknownTopology) {
250 unknownTopology->Release();
251 }
252 if (unknownWave) {
253 unknownWave->Release();
254 }
255
256 return ntStatus;
257}
258
260{
261 PAGED_CODE();
262 DBGPRINT(("AddDevice()"));
263
265}
266
267static
268bool
270{
271 PAGED_CODE();
272 ASSERT(pInResDescriptor);
273 ASSERT(pOutResDescriptor);
274 DBGPRINT(("CopyResourceDescriptor()"));
275
276#if 0
277 RtlCopyMemory(pOutResDescriptor, pInResDescriptor, sizeof(IO_RESOURCE_DESCRIPTOR));
278#else
279 pOutResDescriptor->Type = pInResDescriptor->Type;
280 pOutResDescriptor->ShareDisposition = pInResDescriptor->ShareDisposition;
281 pOutResDescriptor->Flags = pInResDescriptor->Flags;
282 pOutResDescriptor->Option = pInResDescriptor->Option;
283
284 switch (pInResDescriptor->Type) {
287/* // filter crap
288 if ((pInResDescriptor->u.Port.Length == 0) ||
289 ( (pInResDescriptor->u.Port.MinimumAddress.HighPart == pInResDescriptor->u.Port.MaximumAddress.HighPart) && (pInResDescriptor->u.Port.MinimumAddress.LowPart == pInResDescriptor->u.Port.MaximumAddress.LowPart) ) ) {
290 return FALSE;
291 }
292*/ pOutResDescriptor->u.Port.MinimumAddress = pInResDescriptor->u.Port.MinimumAddress;
293 pOutResDescriptor->u.Port.MaximumAddress = pInResDescriptor->u.Port.MaximumAddress;
294 pOutResDescriptor->u.Port.Length = pInResDescriptor->u.Port.Length;
295 pOutResDescriptor->u.Port.Alignment = pInResDescriptor->u.Port.Alignment;
296 DBGPRINT((" Port: min %08x.%08x max %08x.%08x, Length: %x, Option: %x", pOutResDescriptor->u.Port.MinimumAddress.HighPart, pOutResDescriptor->u.Port.MinimumAddress.LowPart,
297 pOutResDescriptor->u.Port.MaximumAddress.HighPart, pOutResDescriptor->u.Port.MaximumAddress.LowPart,
298 pOutResDescriptor->u.Port.Length, pOutResDescriptor->Option));
299 break;
301 pOutResDescriptor->u.Interrupt.MinimumVector = pInResDescriptor->u.Interrupt.MinimumVector;
302 pOutResDescriptor->u.Interrupt.MaximumVector = pInResDescriptor->u.Interrupt.MaximumVector;
303 DBGPRINT((" IRQ: min %x max %x, Option: %d", pOutResDescriptor->u.Interrupt.MinimumVector, pOutResDescriptor->u.Interrupt.MaximumVector, pOutResDescriptor->Option));
304 break;
305 default:
306 return FALSE;
307 }
308 return TRUE;
309#endif
310}
311
313{
314 PAGED_CODE();
316 ASSERT(pIrp);
317 DBGPRINT(("AdapterDispatchPnp()"));
318
319 NTSTATUS ntStatus = STATUS_SUCCESS;
320 ULONG resourceListSize;
324
326 DBGPRINT(("[AdapterDispatchPnp] - IRP_MN_FILTER_RESOURCE_REQUIREMENTS"));
327
328 list = (PIO_RESOURCE_REQUIREMENTS_LIST)pIrp->IoStatus.Information;
329
330 // IO_RESOURCE_REQUIREMENTS_LIST has 1 IO_RESOURCE_LIST, IO_RESOURCE_LIST has 1 IO_RESOURCE_DESCRIPTOR and we want 2 more
331 resourceListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR)*(list->List[0].Count+2) ;
332 resourceList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag(PagedPool, resourceListSize, 'LRDV');
333
334 if (!resourceList) {
336 return ntStatus;
337 }
338
339
340 RtlZeroMemory(resourceList, resourceListSize);
341
342 // initialize the list header
343 resourceList->AlternativeLists = 1; // number of IO_RESOURCE_LISTs
344 resourceList->ListSize = resourceListSize;
345
346 resourceList->List[0].Version = 1;
347 resourceList->List[0].Revision = 1;
348 resourceList->List[0].Count = 0;
349
350 // copy the resources which have already been assigned
351 for (unsigned int i=0;i<list->List[0].Count;i++) {
352 if (CopyResourceDescriptor(&list->List[0].Descriptors[i], &resourceList->List[0].Descriptors[resourceList->List[0].Count])) {
353 resourceList->List[0].Count++;
354 }
355 }
357
358 // an additional port for mpu401
359 resourceList->List[0].Count++;
360 descriptor = &resourceList->List[0].Descriptors[resourceList->List[0].Count-1];
363 descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
365 descriptor->u.Port.MinimumAddress.LowPart = 0x300;
366 descriptor->u.Port.MinimumAddress.HighPart = 0;
367 descriptor->u.Port.MaximumAddress.LowPart = 0x330;
368 descriptor->u.Port.MaximumAddress.HighPart = 0;
369 descriptor->u.Port.Length = 2;
370 descriptor->u.Port.Alignment = 0x10;
371
372 // mpu401 port should be optional. yes, this is severely braindamaged.
373 resourceList->List[0].Count++;
374 descriptor = &resourceList->List[0].Descriptors[resourceList->List[0].Count-1];
377 descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
379 descriptor->u.Port.MinimumAddress.LowPart = 0x0;
380 descriptor->u.Port.MinimumAddress.HighPart = 0;
381 descriptor->u.Port.MaximumAddress.LowPart = 0xFFFF;
382 descriptor->u.Port.MaximumAddress.HighPart = 0;
383 descriptor->u.Port.Length = 1;
384 descriptor->u.Port.Alignment = 0x10;
385
386 DBGPRINT(("number of resource list descriptors: %d", resourceList->List[0].Count));
387
388 pIrp->IoStatus.Information = (ULONG_PTR)resourceList;
389
390 // set the return status
391 pIrp->IoStatus.Status = ntStatus;
392 }
393
394 // Pass the IRPs on to PortCls
395 ntStatus = PcDispatchIrp(pDeviceObject, pIrp);
396
397 return ntStatus;
398}
399
400extern "C"
402NTAPI
404{
405 PAGED_CODE();
406 DBGPRINT(("DriverEntry()"));
407
408 NTSTATUS ntStatus;
409
410 //bind the adapter driver to the portclass driver
411 ntStatus = PcInitializeAdapterDriver(DriverObject, RegistryPathName, AddDevice);
412#ifdef UART
413 if(NT_SUCCESS(ntStatus)) {
415 }
416#endif
417#ifdef WAVERT
418 if (!IoIsWdmVersionAvailable(6,0)) {
419 ntStatus = STATUS_UNSUCCESSFUL;
420 }
421#endif
422
423 return ntStatus;
424}
425
426#ifdef _MSC_VER
427#pragma code_seg()
428#endif
430{
431 return 0;
432}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
#define __cdecl
Definition: accygwin.h:79
NTSTATUS NTAPI CreateMiniportTopologyCMI(OUT PUNKNOWN *Unknown, IN REFCLSID, IN PUNKNOWN UnknownOuter OPTIONAL, IN POOL_TYPE PoolType)
NTSTATUS NTAPI CreateMiniportWaveCMI(OUT PUNKNOWN *Unknown, IN REFCLSID, IN PUNKNOWN UnknownOuter OPTIONAL, IN POOL_TYPE PoolType)
NTSTATUS NewCMIAdapter(OUT PUNKNOWN *Unknown, IN REFCLSID, IN PUNKNOWN UnknownOuter OPTIONAL, IN POOL_TYPE PoolType)
NTSTATUS NTAPI PcAddAdapterDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PCPFNSTARTDEVICE StartDevice, IN ULONG MaxObjects, IN ULONG DeviceExtensionSize)
Definition: adapter.cpp:73
NTSTATUS NTAPI PcInitializeAdapterDriver(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPathName, IN PDRIVER_ADD_DEVICE AddDevice)
Definition: adapter.cpp:29
NTSTATUS NTAPI PcRegisterSubdevice(IN PDEVICE_OBJECT DeviceObject, IN PWCHAR Name, IN PUNKNOWN Unknown)
Definition: adapter.cpp:206
NTSTATUS NTAPI PcNewMiniport(OUT PMINIPORT *OutMiniport, IN REFCLSID ClassId)
Definition: miniport.cpp:45
LONG NTSTATUS
Definition: precomp.h:26
#define IO_RESOURCE_ALTERNATIVE
Definition: edit.c:119
#define IO_RESOURCE_PREFERRED
Definition: edit.c:117
struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST
const GUID IID_IUnknown
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define DBGPRINT(...)
Definition: pdo.c:21
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
DWORD UInt32
Definition: chm_lib.c:104
Definition: list.h:37
NTSTATUS NTAPI PcRegisterPhysicalConnection(IN PDEVICE_OBJECT DeviceObject, IN PUNKNOWN FromUnknown, IN ULONG FromPin, IN PUNKNOWN ToUnknown, IN ULONG ToPin)
Definition: connection.cpp:259
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
int __cdecl _purecall(void)
Definition: adapter.cpp:429
static NTSTATUS ProcessResources(PRESOURCELIST ResourceList, PRESOURCELIST *UartResourceList)
Definition: adapter.cpp:83
NTSTATUS NTAPI AdapterDispatchPnp(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
Definition: adapter.cpp:312
static bool CopyResourceDescriptor(PIO_RESOURCE_DESCRIPTOR pInResDescriptor, PIO_RESOURCE_DESCRIPTOR pOutResDescriptor)
Definition: adapter.cpp:269
@ PIN_WAVE_CAPTURE_SOURCE
Definition: interfaces.hpp:445
@ PIN_WAVE_AC3_RENDER_SOURCE
Definition: interfaces.hpp:449
@ PIN_WAVE_RENDER_SOURCE
Definition: interfaces.hpp:447
@ PIN_SPDIF_AC3_SOURCE
Definition: interfaces.hpp:391
ICMIAdapter * PCMIADAPTER
Definition: interfaces.hpp:261
DRIVER_INITIALIZE DriverEntry
Definition: adapter.cpp:560
NTSTATUS InstallSubdevice(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PWSTR Name, _In_ REFGUID PortClassId, _In_ REFGUID MiniportClassId, _In_opt_ PFNCREATEMINIPORT MiniportCreate, _In_opt_ PUNKNOWN UnknownAdapter, _In_opt_ PRESOURCELIST ResourceList, _In_opt_ REFGUID PortInterfaceId, _Out_opt_ PMINIPORT *OutMiniport, _Out_opt_ PUNKNOWN *OutPortUnknown)
Definition: adapter.cpp:48
#define MAX_MINIPORTS
Definition: adapter.cpp:13
#define ULONG_PTR
Definition: config.h:101
NTSTATUS NTAPI PcRegisterAdapterPowerManagement(IN PUNKNOWN pUnknown, IN PVOID pvContext)
Definition: power.cpp:16
@ PIN_WAVEOUT_SOURCE
Definition: shared.h:114
@ PIN_WAVEIN_DEST
Definition: shared.h:134
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
FxIrp * pIrp
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
CPPORT Port[4]
Definition: headless.c:35
#define CmResourceTypeNonArbitrated
Definition: hwresource.cpp:129
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
NTSTATUS NTAPI PcDispatchIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.cpp:409
#define GUID_NULL
Definition: ks.h:106
#define ASSERT(a)
Definition: mode.c:44
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT * pDeviceObject
Definition: ndis.h:4679
#define CM_RESOURCE_PORT_IO
Definition: cmtypes.h:109
static BOOL StartDevice(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, IN BOOL bEnable, IN DWORD HardwareProfile OPTIONAL, OUT BOOL *bNeedReboot OPTIONAL)
Definition: wizard.c:173
BOOLEAN NTAPI IoIsWdmVersionAvailable(IN UCHAR MajorVersion, IN UCHAR MinorVersion)
Definition: util.c:126
#define STATUS_DEVICE_CONFIGURATION_ERROR
Definition: ntstatus.h:619
#define L(x)
Definition: ntvdm.h:50
DRIVER_ADD_DEVICE AddDevice
Definition: parport.h:72
NTSTATUS NTAPI PcNewPort(OUT PPORT *OutPort, IN REFCLSID ClassId)
Definition: port.cpp:17
IResourceList * PRESOURCELIST
Definition: portcls.h:442
IPortEvents * PPORTEVENTS
Definition: portcls.h:2121
IPort * PPORT
Definition: portcls.h:1105
HRESULT(NTAPI * PFNCREATEINSTANCE)(_Out_ PUNKNOWN *Unknown, _In_ REFCLSID ClassId, _In_ PUNKNOWN OuterUnknown, _In_ POOL_TYPE PoolType)
Definition: punknown.h:75
PORTCLASSAPI NTSTATUS NTAPI PcNewResourceSublist(OUT PRESOURCELIST *OutResourceList, IN PUNKNOWN OuterUnknown OPTIONAL, IN POOL_TYPE PoolType, IN PRESOURCELIST ParentList, IN ULONG MaximumEntries)
Definition: resource.cpp:395
#define list
Definition: rosglue.h:35
descriptor
Definition: scsi.h:3951
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: scsiwmi.h:51
union _IO_RESOURCE_DESCRIPTOR::@21 u
struct _IO_RESOURCE_DESCRIPTOR::@21::@22 Port
struct _IO_RESOURCE_DESCRIPTOR::@21::@24 Interrupt
UCHAR ShareDisposition
Definition: edit.c:61
ULONG Count
Definition: edit.c:124
USHORT Revision
Definition: edit.c:123
USHORT Version
Definition: edit.c:122
IO_RESOURCE_DESCRIPTOR Descriptors[1]
Definition: edit.c:125
IO_RESOURCE_LIST List[1]
Definition: edit.c:135
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:309
@ CmResourceShareDeviceExclusive
Definition: cmtypes.h:241
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS