1 /* 2 * VideoPort driver 3 * 4 * Copyright (C) 2002, 2003, 2004 ReactOS Team 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 */ 21 22 #ifndef VIDEOPRT_H 23 #define VIDEOPRT_H 24 25 #include <ntifs.h> 26 27 #define __BROKEN__ 28 #include <miniport.h> 29 #include <video.h> 30 #include <ntagp.h> 31 #include <dderror.h> 32 #include <windef.h> 33 #include <wdmguid.h> 34 35 /* PSEH for SEH Support */ 36 #include <pseh/pseh2.h> 37 38 #define TAG_VIDEO_PORT 'PDIV' 39 #define TAG_VIDEO_PORT_BUFFER '\0mpV' 40 #define TAG_REQUEST_PACKET 'qRpV' 41 42 #define GUID_STRING_LENGTH (38 * sizeof(WCHAR)) 43 44 typedef struct _VIDEO_PORT_ADDRESS_MAPPING 45 { 46 LIST_ENTRY List; 47 PVOID MappedAddress; 48 ULONG NumberOfUchars; 49 PHYSICAL_ADDRESS IoAddress; 50 ULONG SystemIoBusNumber; 51 UINT MappingCount; 52 } VIDEO_PORT_ADDRESS_MAPPING, *PVIDEO_PORT_ADDRESS_MAPPING; 53 54 struct _VIDEO_PORT_AGP_VIRTUAL_MAPPING; 55 56 typedef struct _VIDEO_PORT_AGP_MAPPING 57 { 58 ULONG NumberOfPages; 59 PVOID MapHandle; 60 PHYSICAL_ADDRESS PhysicalAddress; 61 } VIDEO_PORT_AGP_MAPPING, *PVIDEO_PORT_AGP_MAPPING; 62 63 typedef struct _VIDEO_PORT_AGP_VIRTUAL_MAPPING 64 { 65 PVIDEO_PORT_AGP_MAPPING AgpMapping; 66 HANDLE ProcessHandle; 67 PVOID MappedAddress; 68 } VIDEO_PORT_AGP_VIRTUAL_MAPPING, *PVIDEO_PORT_AGP_VIRTUAL_MAPPING; 69 70 typedef struct _VIDEO_PORT_DRIVER_EXTENSION 71 { 72 VIDEO_HW_INITIALIZATION_DATA InitializationData; 73 PVOID HwContext; 74 UNICODE_STRING RegistryPath; 75 } VIDEO_PORT_DRIVER_EXTENSION, *PVIDEO_PORT_DRIVER_EXTENSION; 76 77 typedef struct _VIDEO_PORT_COMMON_EXTENSION 78 { 79 BOOLEAN Fdo; 80 } VIDEO_PORT_COMMON_EXTENSION, *PVIDEO_PORT_COMMON_EXTENSION; 81 82 typedef struct _VIDEO_PORT_DEVICE_EXTENSTION 83 { 84 VIDEO_PORT_COMMON_EXTENSION Common; 85 ULONG DeviceNumber; 86 PDRIVER_OBJECT DriverObject; 87 PDEVICE_OBJECT PhysicalDeviceObject; 88 PDEVICE_OBJECT FunctionalDeviceObject; 89 PDEVICE_OBJECT NextDeviceObject; 90 UNICODE_STRING RegistryPath; 91 UNICODE_STRING NewRegistryPath; 92 PKINTERRUPT InterruptObject; 93 KSPIN_LOCK InterruptSpinLock; 94 PCM_RESOURCE_LIST AllocatedResources; 95 ULONG InterruptVector; 96 ULONG InterruptLevel; 97 BOOLEAN InterruptShared; 98 INTERFACE_TYPE AdapterInterfaceType; 99 ULONG SystemIoBusNumber; 100 ULONG SystemIoSlotNumber; 101 LIST_ENTRY AddressMappingListHead; 102 KDPC DpcObject; 103 VIDEO_PORT_DRIVER_EXTENSION *DriverExtension; 104 ULONG DeviceOpened; 105 AGP_BUS_INTERFACE_STANDARD AgpInterface; 106 KMUTEX DeviceLock; 107 LIST_ENTRY DmaAdapterList, ChildDeviceList; 108 LIST_ENTRY HwResetListEntry; 109 ULONG SessionId; 110 USHORT AdapterNumber; 111 USHORT DisplayNumber; 112 ULONG NumberOfSecondaryDisplays; 113 CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]; 114 } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION; 115 116 typedef struct _VIDEO_PORT_CHILD_EXTENSION 117 { 118 VIDEO_PORT_COMMON_EXTENSION Common; 119 120 ULONG ChildId; 121 VIDEO_CHILD_TYPE ChildType; 122 UCHAR ChildDescriptor[256]; 123 124 BOOLEAN EdidValid; 125 126 PDRIVER_OBJECT DriverObject; 127 PDEVICE_OBJECT PhysicalDeviceObject; 128 129 LIST_ENTRY ListEntry; 130 131 CHAR ChildDeviceExtension[1]; 132 } VIDEO_PORT_CHILD_EXTENSION, *PVIDEO_PORT_CHILD_EXTENSION; 133 134 #define VIDEO_PORT_GET_CHILD_EXTENSION(MiniportExtension) \ 135 CONTAINING_RECORD( \ 136 MiniportExtension, \ 137 VIDEO_PORT_CHILD_EXTENSION, \ 138 ChildDeviceExtension) 139 140 #define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension) \ 141 CONTAINING_RECORD( \ 142 MiniportExtension, \ 143 VIDEO_PORT_DEVICE_EXTENSION, \ 144 MiniPortDeviceExtension) 145 146 typedef struct _VIDEO_PORT_EVENT 147 { 148 ENG_EVENT; 149 } VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT; 150 151 /* agp.c */ 152 153 NTSTATUS 154 IopInitiatePnpIrp( 155 PDEVICE_OBJECT DeviceObject, 156 PIO_STATUS_BLOCK IoStatusBlock, 157 UCHAR MinorFunction, 158 PIO_STACK_LOCATION Stack OPTIONAL); 159 160 NTSTATUS NTAPI 161 IntAgpGetInterface( 162 IN PVOID HwDeviceExtension, 163 IN OUT PINTERFACE Interface); 164 165 /* child.c */ 166 167 NTSTATUS NTAPI 168 IntVideoPortDispatchPdoPnp( 169 IN PDEVICE_OBJECT DeviceObject, 170 IN PIRP Irp); 171 172 /* dispatch.c */ 173 174 NTSTATUS NTAPI 175 IntVideoPortAddDevice( 176 IN PDRIVER_OBJECT DriverObject, 177 IN PDEVICE_OBJECT PhysicalDeviceObject); 178 179 NTSTATUS NTAPI 180 IntVideoPortDispatchOpen( 181 IN PDEVICE_OBJECT DeviceObject, 182 IN PIRP Irp); 183 184 NTSTATUS NTAPI 185 IntVideoPortDispatchClose( 186 IN PDEVICE_OBJECT DeviceObject, 187 IN PIRP Irp); 188 189 NTSTATUS NTAPI 190 IntVideoPortDispatchCleanup( 191 IN PDEVICE_OBJECT DeviceObject, 192 IN PIRP Irp); 193 194 NTSTATUS NTAPI 195 IntVideoPortDispatchDeviceControl( 196 IN PDEVICE_OBJECT DeviceObject, 197 IN PIRP Irp); 198 199 NTSTATUS NTAPI 200 IntVideoPortDispatchPnp( 201 IN PDEVICE_OBJECT DeviceObject, 202 IN PIRP Irp); 203 204 NTSTATUS NTAPI 205 IntVideoPortDispatchPower( 206 IN PDEVICE_OBJECT DeviceObject, 207 IN PIRP Irp); 208 209 NTSTATUS NTAPI 210 IntVideoPortDispatchSystemControl( 211 IN PDEVICE_OBJECT DeviceObject, 212 IN PIRP Irp); 213 214 VOID NTAPI 215 IntVideoPortUnload(PDRIVER_OBJECT DriverObject); 216 217 /* timer.c */ 218 219 BOOLEAN NTAPI 220 IntVideoPortSetupTimer( 221 IN PDEVICE_OBJECT DeviceObject, 222 IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension); 223 224 /* interrupt.c */ 225 226 BOOLEAN NTAPI 227 IntVideoPortSetupInterrupt( 228 IN PDEVICE_OBJECT DeviceObject, 229 IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, 230 IN PVIDEO_PORT_CONFIG_INFO ConfigInfo); 231 232 /* resource.c */ 233 234 NTSTATUS NTAPI 235 IntVideoPortFilterResourceRequirements( 236 IN PDEVICE_OBJECT DeviceObject, 237 IN PIO_STACK_LOCATION IrpStack, 238 IN PIRP Irp); 239 240 VOID 241 IntVideoPortReleaseResources( 242 _In_ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension); 243 244 NTSTATUS NTAPI 245 IntVideoPortMapPhysicalMemory( 246 IN HANDLE Process, 247 IN PHYSICAL_ADDRESS PhysicalAddress, 248 IN ULONG SizeInBytes, 249 IN ULONG Protect, 250 IN OUT PVOID *VirtualAddress OPTIONAL); 251 252 /* videoprt.c */ 253 254 extern PKPROCESS CsrProcess; 255 extern ULONG VideoPortDeviceNumber; 256 extern BOOLEAN VideoPortUseNewKey; 257 extern KMUTEX VideoPortInt10Mutex; 258 extern KSPIN_LOCK HwResetAdaptersLock; 259 extern LIST_ENTRY HwResetAdaptersList; 260 261 VOID FASTCALL 262 IntAttachToCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState); 263 264 VOID FASTCALL 265 IntDetachFromCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState); 266 267 NTSTATUS NTAPI 268 IntVideoPortCreateAdapterDeviceObject( 269 _In_ PDRIVER_OBJECT DriverObject, 270 _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, 271 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, 272 _In_ USHORT AdapterNumber, 273 _In_ USHORT DisplayNumber, 274 _Out_opt_ PDEVICE_OBJECT *DeviceObject); 275 276 NTSTATUS NTAPI 277 IntVideoPortFindAdapter( 278 IN PDRIVER_OBJECT DriverObject, 279 IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, 280 IN PDEVICE_OBJECT DeviceObject); 281 282 PVOID NTAPI 283 IntVideoPortGetProcAddress( 284 IN PVOID HwDeviceExtension, 285 IN PUCHAR FunctionName); 286 287 NTSTATUS NTAPI 288 IntVideoPortEnumerateChildren( 289 IN PDEVICE_OBJECT DeviceObject, 290 IN PIRP Irp); 291 292 /* int10.c */ 293 294 NTSTATUS 295 NTAPI 296 IntInitializeVideoAddressSpace(VOID); 297 298 VP_STATUS NTAPI 299 IntInt10AllocateBuffer( 300 IN PVOID Context, 301 OUT PUSHORT Seg, 302 OUT PUSHORT Off, 303 IN OUT PULONG Length); 304 305 VP_STATUS NTAPI 306 IntInt10FreeBuffer( 307 IN PVOID Context, 308 IN USHORT Seg, 309 IN USHORT Off); 310 311 VP_STATUS NTAPI 312 IntInt10ReadMemory( 313 IN PVOID Context, 314 IN USHORT Seg, 315 IN USHORT Off, 316 OUT PVOID Buffer, 317 IN ULONG Length); 318 319 VP_STATUS NTAPI 320 IntInt10WriteMemory( 321 IN PVOID Context, 322 IN USHORT Seg, 323 IN USHORT Off, 324 IN PVOID Buffer, 325 IN ULONG Length); 326 327 VP_STATUS NTAPI 328 IntInt10CallBios( 329 IN PVOID Context, 330 IN OUT PINT10_BIOS_ARGUMENTS BiosArguments); 331 332 /* registry.c */ 333 334 NTSTATUS 335 NTAPI 336 IntCopyRegistryKey( 337 _In_ HANDLE SourceKeyHandle, 338 _In_ HANDLE DestKeyHandle); 339 340 NTSTATUS 341 NTAPI 342 IntCopyRegistryValue( 343 HANDLE SourceKeyHandle, 344 HANDLE DestKeyHandle, 345 PWSTR ValueName); 346 347 NTSTATUS 348 NTAPI 349 IntSetupDeviceSettingsKey( 350 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension); 351 352 NTSTATUS 353 NTAPI 354 IntCreateNewRegistryPath( 355 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension); 356 357 NTSTATUS 358 NTAPI 359 IntCreateRegistryPath( 360 IN PCUNICODE_STRING DriverRegistryPath, 361 IN ULONG DeviceNumber, 362 OUT PUNICODE_STRING DeviceRegistryPath); 363 364 365 #endif /* VIDEOPRT_H */ 366