ReactOS 0.4.16-dev-329-g9223134
io.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define EMULATOR_MAX_IOPORTS_NUM   0x10000
 

Typedefs

typedef UCHAR(WINAPIEMULATOR_INB_PROC) (USHORT Port)
 
typedef USHORT(WINAPIEMULATOR_INW_PROC) (USHORT Port)
 
typedef ULONG(WINAPIEMULATOR_IND_PROC) (USHORT Port)
 
typedef VOID(WINAPIEMULATOR_INSB_PROC) (USHORT Port, PUCHAR Buffer, ULONG Count)
 
typedef VOID(WINAPIEMULATOR_INSW_PROC) (USHORT Port, PUSHORT Buffer, ULONG Count)
 
typedef VOID(WINAPIEMULATOR_INSD_PROC) (USHORT Port, PULONG Buffer, ULONG Count)
 
typedef VOID(WINAPIEMULATOR_OUTB_PROC) (USHORT Port, UCHAR Data)
 
typedef VOID(WINAPIEMULATOR_OUTW_PROC) (USHORT Port, USHORT Data)
 
typedef VOID(WINAPIEMULATOR_OUTD_PROC) (USHORT Port, ULONG Data)
 
typedef VOID(WINAPIEMULATOR_OUTSB_PROC) (USHORT Port, PUCHAR Buffer, ULONG Count)
 
typedef VOID(WINAPIEMULATOR_OUTSW_PROC) (USHORT Port, PUSHORT Buffer, ULONG Count)
 
typedef VOID(WINAPIEMULATOR_OUTSD_PROC) (USHORT Port, PULONG Buffer, ULONG Count)
 

Functions

UCHAR IOReadB (USHORT Port)
 
VOID IOReadStrB (USHORT Port, PUCHAR Buffer, ULONG Count)
 
VOID IOWriteB (USHORT Port, UCHAR Buffer)
 
VOID IOWriteStrB (USHORT Port, PUCHAR Buffer, ULONG Count)
 
USHORT IOReadW (USHORT Port)
 
VOID IOReadStrW (USHORT Port, PUSHORT Buffer, ULONG Count)
 
VOID IOWriteW (USHORT Port, USHORT Buffer)
 
VOID IOWriteStrW (USHORT Port, PUSHORT Buffer, ULONG Count)
 
ULONG IOReadD (USHORT Port)
 
VOID IOReadStrD (USHORT Port, PULONG Buffer, ULONG Count)
 
VOID IOWriteD (USHORT Port, ULONG Buffer)
 
VOID IOWriteStrD (USHORT Port, PULONG Buffer, ULONG Count)
 
VOID RegisterIoPort (USHORT Port, EMULATOR_INB_PROC InHandler, EMULATOR_OUTB_PROC OutHandler)
 
VOID UnregisterIoPort (USHORT Port)
 
VOID FASTCALL EmulatorReadIo (PFAST486_STATE State, USHORT Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
 
VOID FASTCALL EmulatorWriteIo (PFAST486_STATE State, USHORT Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
 

Macro Definition Documentation

◆ EMULATOR_MAX_IOPORTS_NUM

#define EMULATOR_MAX_IOPORTS_NUM   0x10000

Definition at line 15 of file io.h.

Typedef Documentation

◆ EMULATOR_INB_PROC

typedef UCHAR(WINAPI * EMULATOR_INB_PROC) (USHORT Port)

Definition at line 19 of file io.h.

◆ EMULATOR_IND_PROC

typedef ULONG(WINAPI * EMULATOR_IND_PROC) (USHORT Port)

Definition at line 21 of file io.h.

◆ EMULATOR_INSB_PROC

typedef VOID(WINAPI * EMULATOR_INSB_PROC) (USHORT Port, PUCHAR Buffer, ULONG Count)

Definition at line 23 of file io.h.

◆ EMULATOR_INSD_PROC

typedef VOID(WINAPI * EMULATOR_INSD_PROC) (USHORT Port, PULONG Buffer, ULONG Count)

Definition at line 25 of file io.h.

◆ EMULATOR_INSW_PROC

typedef VOID(WINAPI * EMULATOR_INSW_PROC) (USHORT Port, PUSHORT Buffer, ULONG Count)

Definition at line 24 of file io.h.

◆ EMULATOR_INW_PROC

typedef USHORT(WINAPI * EMULATOR_INW_PROC) (USHORT Port)

Definition at line 20 of file io.h.

◆ EMULATOR_OUTB_PROC

typedef VOID(WINAPI * EMULATOR_OUTB_PROC) (USHORT Port, UCHAR Data)

Definition at line 27 of file io.h.

◆ EMULATOR_OUTD_PROC

typedef VOID(WINAPI * EMULATOR_OUTD_PROC) (USHORT Port, ULONG Data)

Definition at line 29 of file io.h.

◆ EMULATOR_OUTSB_PROC

typedef VOID(WINAPI * EMULATOR_OUTSB_PROC) (USHORT Port, PUCHAR Buffer, ULONG Count)

Definition at line 31 of file io.h.

◆ EMULATOR_OUTSD_PROC

typedef VOID(WINAPI * EMULATOR_OUTSD_PROC) (USHORT Port, PULONG Buffer, ULONG Count)

Definition at line 33 of file io.h.

◆ EMULATOR_OUTSW_PROC

typedef VOID(WINAPI * EMULATOR_OUTSW_PROC) (USHORT Port, PUSHORT Buffer, ULONG Count)

Definition at line 32 of file io.h.

◆ EMULATOR_OUTW_PROC

typedef VOID(WINAPI * EMULATOR_OUTW_PROC) (USHORT Port, USHORT Data)

Definition at line 28 of file io.h.

Function Documentation

◆ EmulatorReadIo()

VOID FASTCALL EmulatorReadIo ( PFAST486_STATE  State,
USHORT  Port,
PVOID  Buffer,
ULONG  DataCount,
UCHAR  DataSize 
)

Definition at line 349 of file io.c.

354{
356
357 if (DataSize == 0 || DataCount == 0) return;
358
359 if (DataSize == sizeof(UCHAR))
360 {
361 if (DataCount == 1)
363 else
364 IOReadStrB(Port, Buffer, DataCount);
365 }
366 else if (DataSize == sizeof(USHORT))
367 {
368 if (DataCount == 1)
370 else
371 IOReadStrW(Port, Buffer, DataCount);
372 }
373 else if (DataSize == sizeof(ULONG))
374 {
375 if (DataCount == 1)
377 else
378 IOReadStrD(Port, Buffer, DataCount);
379 }
380 else
381 {
383
384 while (DataCount--)
385 {
386 ULONG CurrentPort = Port;
387 ULONG Count;
388 UCHAR NewDataSize = DataSize;
389
390 /* Read dword */
391 Count = NewDataSize >> 2; // NewDataSize / sizeof(ULONG);
392 NewDataSize = NewDataSize & 3; // NewDataSize % sizeof(ULONG);
393 while (Count--)
394 {
395 *(PULONG)Address = IOReadD(CurrentPort);
396 CurrentPort += sizeof(ULONG);
397 Address += sizeof(ULONG);
398 }
399
400 /* Read word */
401 Count = NewDataSize >> 1; // NewDataSize / sizeof(USHORT);
402 NewDataSize = NewDataSize & 1; // NewDataSize % sizeof(USHORT);
403 while (Count--)
404 {
405 *(PUSHORT)Address = IOReadW(CurrentPort);
406 CurrentPort += sizeof(USHORT);
407 Address += sizeof(USHORT);
408 }
409
410 /* Read byte */
411 Count = NewDataSize; // NewDataSize / sizeof(UCHAR);
412 // NewDataSize = NewDataSize % sizeof(UCHAR);
413 while (Count--)
414 {
415 *(PUCHAR)Address = IOReadB(CurrentPort);
416 CurrentPort += sizeof(UCHAR);
417 Address += sizeof(UCHAR);
418 }
419 }
420 }
421}
Definition: bufpool.h:45
CPPORT Port[4]
Definition: headless.c:35
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
int Count
Definition: noreturn.cpp:7
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
ULONG IOReadD(USHORT Port)
Definition: io.c:252
VOID IOReadStrB(USHORT Port, PUCHAR Buffer, ULONG Count)
Definition: io.c:88
USHORT IOReadW(USHORT Port)
Definition: io.c:156
VOID IOReadStrW(USHORT Port, PUSHORT Buffer, ULONG Count)
Definition: io.c:183
VOID IOReadStrD(USHORT Port, PULONG Buffer, ULONG Count)
Definition: io.c:271
UCHAR IOReadB(USHORT Port)
Definition: io.c:64
uint32_t * PULONG
Definition: typedefs.h:59
uint16_t * PUSHORT
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by CpuInitialize().

◆ EmulatorWriteIo()

VOID FASTCALL EmulatorWriteIo ( PFAST486_STATE  State,
USHORT  Port,
PVOID  Buffer,
ULONG  DataCount,
UCHAR  DataSize 
)

Definition at line 424 of file io.c.

429{
431
432 if (DataSize == 0 || DataCount == 0) return;
433
434 if (DataSize == sizeof(UCHAR))
435 {
436 if (DataCount == 1)
438 else
439 IOWriteStrB(Port, Buffer, DataCount);
440 }
441 else if (DataSize == sizeof(USHORT))
442 {
443 if (DataCount == 1)
445 else
446 IOWriteStrW(Port, Buffer, DataCount);
447 }
448 else if (DataSize == sizeof(ULONG))
449 {
450 if (DataCount == 1)
452 else
453 IOWriteStrD(Port, Buffer, DataCount);
454 }
455 else
456 {
458
459 while (DataCount--)
460 {
461 ULONG CurrentPort = Port;
462 ULONG Count;
463 UCHAR NewDataSize = DataSize;
464
465 /* Write dword */
466 Count = NewDataSize >> 2; // NewDataSize / sizeof(ULONG);
467 NewDataSize = NewDataSize & 3; // NewDataSize % sizeof(ULONG);
468 while (Count--)
469 {
470 IOWriteD(CurrentPort, *(PULONG)Address);
471 CurrentPort += sizeof(ULONG);
472 Address += sizeof(ULONG);
473 }
474
475 /* Write word */
476 Count = NewDataSize >> 1; // NewDataSize / sizeof(USHORT);
477 NewDataSize = NewDataSize & 1; // NewDataSize % sizeof(USHORT);
478 while (Count--)
479 {
480 IOWriteW(CurrentPort, *(PUSHORT)Address);
481 CurrentPort += sizeof(USHORT);
482 Address += sizeof(USHORT);
483 }
484
485 /* Write byte */
486 Count = NewDataSize; // NewDataSize / sizeof(UCHAR);
487 // NewDataSize = NewDataSize % sizeof(UCHAR);
488 while (Count--)
489 {
490 IOWriteB(CurrentPort, *(PUCHAR)Address);
491 CurrentPort += sizeof(UCHAR);
492 Address += sizeof(UCHAR);
493 }
494 }
495 }
496}
VOID IOWriteB(USHORT Port, UCHAR Buffer)
Definition: io.c:111
VOID IOWriteW(USHORT Port, USHORT Buffer)
Definition: io.c:206
VOID IOWriteD(USHORT Port, ULONG Buffer)
Definition: io.c:287
VOID IOWriteStrW(USHORT Port, PUSHORT Buffer, ULONG Count)
Definition: io.c:229
VOID IOWriteStrD(USHORT Port, PULONG Buffer, ULONG Count)
Definition: io.c:304
VOID IOWriteStrB(USHORT Port, PUCHAR Buffer, ULONG Count)
Definition: io.c:133

Referenced by CpuInitialize().

◆ IOReadB()

UCHAR IOReadB ( USHORT  Port)

Definition at line 64 of file io.c.

65{
67 IoPortProc[Port].IoHandlers.InB)
68 {
70 }
72 IoPortProc[Port].VddIoHandlers.inb_handler)
73 {
74 UCHAR Data;
77 return Data;
78 }
79 else
80 {
81 /* Return an empty port byte value */
82 DPRINT("Read from unknown port: 0x%X\n", Port);
83 return 0xFF;
84 }
85}
#define NULL
Definition: types.h:112
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define ASSERT(a)
Definition: mode.c:44
#define MAXWORD
#define DPRINT
Definition: sndvol32.h:73
VDD_IO_HANDLERS VddIoHandlers
Definition: io.c:49
EMULATOR_IO_HANDLERS IoHandlers
Definition: io.c:52
EMULATOR_INB_PROC InB
Definition: io.c:24
PFNVDD_INB inb_handler
Definition: nt_vdd.h:145
EMULATOR_IOPORT_HANDLERS IoPortProc[EMULATOR_MAX_IOPORTS_NUM]
Definition: io.c:59
HANDLE hVdd
Definition: testvdd.c:87

Referenced by Bios32Post(), BiosBootstrapLoader(), BiosHandleMasterPicIRQ(), BiosHandleSlavePicIRQ(), BiosKeyboardIrq(), BiosMiscService(), BiosTimeService(), DisableMouseInt(), DosMouseIrq(), EmulatorReadIo(), EnableMouseInt(), EraseMouseCursor(), InitializeBiosData(), IOReadStrB(), IOReadW(), PaintMouseCursor(), PicSetIRQMask(), ReadMouseData(), VbeInitialize(), VbeResetExtendedRegisters(), VbeService(), VbeSetExtendedRegisters(), VgaSetRegisters(), VgaSetSinglePaletteRegister(), VidBiosClearScreen(), VidBiosDrawGlyph(), VidBiosSyncCursorPosition(), and VidBiosVideoService().

◆ IOReadD()

ULONG IOReadD ( USHORT  Port)

Definition at line 252 of file io.c.

253{
255 IoPortProc[Port].IoHandlers.InD)
256 {
258 }
259 else
260 {
261 USHORT Low, High;
262
263 // FIXME: Is it ok on Little endian and Big endian ??
264 Low = IOReadW(Port);
265 High = IOReadW(Port + sizeof(USHORT));
266 return MAKELONG(Low, High);
267 }
268}
@ High
Definition: strmini.h:378
@ Low
Definition: strmini.h:380
EMULATOR_IND_PROC InD
Definition: io.c:26
#define MAKELONG(a, b)
Definition: typedefs.h:249

Referenced by EmulatorReadIo(), and IOReadStrD().

◆ IOReadStrB()

VOID IOReadStrB ( USHORT  Port,
PUCHAR  Buffer,
ULONG  Count 
)

Definition at line 88 of file io.c.

91{
93 IoPortProc[Port].IoHandlers.InsB)
94 {
96 }
98 IoPortProc[Port].VddIoHandlers.insb_handler)
99 {
100 ASSERT(Port <= MAXWORD);
101 ASSERT(Count <= MAXWORD);
103 }
104 else
105 {
106 while (Count--) *Buffer++ = IOReadB(Port);
107 }
108}
unsigned short WORD
Definition: ntddk_ex.h:93
EMULATOR_INSB_PROC InsB
Definition: io.c:28
PFNVDD_INSB insb_handler
Definition: nt_vdd.h:147

Referenced by EmulatorReadIo().

◆ IOReadStrD()

VOID IOReadStrD ( USHORT  Port,
PULONG  Buffer,
ULONG  Count 
)

Definition at line 271 of file io.c.

274{
276 IoPortProc[Port].IoHandlers.InsD)
277 {
279 }
280 else
281 {
282 while (Count--) *Buffer++ = IOReadD(Port);
283 }
284}
EMULATOR_INSD_PROC InsD
Definition: io.c:30

Referenced by EmulatorReadIo().

◆ IOReadStrW()

VOID IOReadStrW ( USHORT  Port,
PUSHORT  Buffer,
ULONG  Count 
)

Definition at line 183 of file io.c.

186{
188 IoPortProc[Port].IoHandlers.InsW)
189 {
191 }
193 IoPortProc[Port].VddIoHandlers.insw_handler)
194 {
195 ASSERT(Port <= MAXWORD);
196 ASSERT(Count <= MAXWORD);
198 }
199 else
200 {
201 while (Count--) *Buffer++ = IOReadW(Port);
202 }
203}
EMULATOR_INSW_PROC InsW
Definition: io.c:29
PFNVDD_INSW insw_handler
Definition: nt_vdd.h:148

Referenced by EmulatorReadIo().

◆ IOReadW()

USHORT IOReadW ( USHORT  Port)

Definition at line 156 of file io.c.

157{
159 IoPortProc[Port].IoHandlers.InW)
160 {
162 }
164 IoPortProc[Port].VddIoHandlers.inw_handler)
165 {
166 USHORT Data;
167 ASSERT(Port <= MAXWORD);
169 return Data;
170 }
171 else
172 {
173 UCHAR Low, High;
174
175 // FIXME: Is it ok on Little endian and Big endian ??
176 Low = IOReadB(Port);
177 High = IOReadB(Port + sizeof(UCHAR));
178 return MAKEWORD(Low, High);
179 }
180}
EMULATOR_INW_PROC InW
Definition: io.c:25
PFNVDD_INW inw_handler
Definition: nt_vdd.h:146
#define MAKEWORD(a, b)
Definition: typedefs.h:248

Referenced by EmulatorReadIo(), IOReadD(), and IOReadStrW().

◆ IOWriteB()

◆ IOWriteD()

VOID IOWriteD ( USHORT  Port,
ULONG  Buffer 
)

Definition at line 287 of file io.c.

289{
291 IoPortProc[Port].IoHandlers.OutD)
292 {
294 }
295 else
296 {
297 // FIXME: Is it ok on Little endian and Big endian ??
299 IOWriteW(Port + sizeof(USHORT), HIWORD(Buffer));
300 }
301}
#define LOWORD(l)
Definition: pedump.c:82
EMULATOR_OUTD_PROC OutD
Definition: io.c:34
#define HIWORD(l)
Definition: typedefs.h:247

Referenced by EmulatorWriteIo(), and IOWriteStrD().

◆ IOWriteStrB()

VOID IOWriteStrB ( USHORT  Port,
PUCHAR  Buffer,
ULONG  Count 
)

Definition at line 133 of file io.c.

136{
138 IoPortProc[Port].IoHandlers.OutsB)
139 {
141 }
143 IoPortProc[Port].VddIoHandlers.outsb_handler)
144 {
145 ASSERT(Port <= MAXWORD);
146 ASSERT(Count <= MAXWORD);
148 }
149 else
150 {
151 while (Count--) IOWriteB(Port, *Buffer++);
152 }
153}
EMULATOR_OUTSB_PROC OutsB
Definition: io.c:36
PFNVDD_OUTSB outsb_handler
Definition: nt_vdd.h:151

Referenced by EmulatorWriteIo().

◆ IOWriteStrD()

VOID IOWriteStrD ( USHORT  Port,
PULONG  Buffer,
ULONG  Count 
)

Definition at line 304 of file io.c.

307{
309 IoPortProc[Port].IoHandlers.OutsD)
310 {
312 }
313 else
314 {
315 while (Count--) IOWriteD(Port, *Buffer++);
316 }
317}
EMULATOR_OUTSD_PROC OutsD
Definition: io.c:38

Referenced by EmulatorWriteIo().

◆ IOWriteStrW()

VOID IOWriteStrW ( USHORT  Port,
PUSHORT  Buffer,
ULONG  Count 
)

Definition at line 229 of file io.c.

232{
234 IoPortProc[Port].IoHandlers.OutsW)
235 {
237 }
239 IoPortProc[Port].VddIoHandlers.outsw_handler)
240 {
241 ASSERT(Port <= MAXWORD);
242 ASSERT(Count <= MAXWORD);
244 }
245 else
246 {
247 while (Count--) IOWriteW(Port, *Buffer++);
248 }
249}
EMULATOR_OUTSW_PROC OutsW
Definition: io.c:37
PFNVDD_OUTSW outsw_handler
Definition: nt_vdd.h:152

Referenced by EmulatorWriteIo().

◆ IOWriteW()

VOID IOWriteW ( USHORT  Port,
USHORT  Buffer 
)

Definition at line 206 of file io.c.

208{
210 IoPortProc[Port].IoHandlers.OutW)
211 {
213 }
215 IoPortProc[Port].VddIoHandlers.outw_handler)
216 {
217 ASSERT(Port <= MAXWORD);
219 }
220 else
221 {
222 // FIXME: Is it ok on Little endian and Big endian ??
224 IOWriteB(Port + sizeof(UCHAR), HIBYTE(Buffer));
225 }
226}
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
EMULATOR_OUTW_PROC OutW
Definition: io.c:33
PFNVDD_OUTW outw_handler
Definition: nt_vdd.h:150

Referenced by EmulatorWriteIo(), IOWriteD(), and IOWriteStrW().

◆ RegisterIoPort()

VOID RegisterIoPort ( USHORT  Port,
EMULATOR_INB_PROC  InHandler,
EMULATOR_OUTB_PROC  OutHandler 
)

Definition at line 320 of file io.c.

323{
324 if (IoPortProc[Port].IoHandlers.InB == NULL)
325 IoPortProc[Port].IoHandlers.InB = InHandler;
326 else
327 DPRINT1("IoPortProc[0x%X].IoHandlers.InB already registered\n", Port);
328
329 if (IoPortProc[Port].IoHandlers.OutB == NULL)
330 IoPortProc[Port].IoHandlers.OutB = OutHandler;
331 else
332 DPRINT1("IoPortProc[0x%X].IoHandlers.OutB already registered\n", Port);
333
334 /* We hold the I/O port internally */
336}
#define DPRINT1
Definition: precomp.h:8

Referenced by CmosInitialize(), DmaInitialize(), PicInitialize(), PitInitialize(), PpiInitialize(), PS2Initialize(), VgaInitialize(), and VgaWritePort().

◆ UnregisterIoPort()

VOID UnregisterIoPort ( USHORT  Port)

Definition at line 338 of file io.c.

339{
340 /*
341 * Put automagically all the fields to zero:
342 * the hVdd gets unregistered as well as all the handlers.
343 */
344 // IoPortProc[Port] = {NULL};
346}
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by VgaWritePort().