|
|
1.1 root 1: // Read a byte from a port using the wkd driver.
2: // Robert R. Howell January 6, 1993
3: // Robert B. Nelson (Microsoft) January 12, 1993
4:
5:
6: #include <windows.h>
7: #include <stdio.h>
8: #include <stdlib.h>
9: #include <winioctl.h>
10: #include "gpioctl.h" // This defines the IOCTL constants.
11:
12: void main(int argc, char ** argv)
13: {
14:
15: // The following is returned by IOCTL. It is true if the read succeeds.
16: BOOL IoctlResult;
17:
18: // The following parameters are used in the IOCTL call
19: HANDLE hndFile; // Handle to device, obtain from CreateFile
20: ULONG PortNumber; // Buffer sent to the driver (Port #).
21: union {
22: ULONG LongData;
23: USHORT ShortData;
24: UCHAR CharData;
25: } DataBuffer; // Buffer received from driver (Data).
26: LONG IoctlCode;
27: ULONG DataLength;
28: DWORD ReturnedLength; // Number of bytes returned
29:
30: // The input buffer is a ULONG containing the port address. It is
31: // specified as 0, 1, 2, ... relative to the base address set in genport.h
32: // or overridden by the registry.
33:
34: // The port data is returned in the output buffer DataBuffer;
35:
36: if ( argc < 3 || argv[1][0] != '-' ||
37: ( argv[1][1] != 'b' && argv[1][1] != 'w' && argv[1][1] != 'd' ) )
38: {
39: printf("GpdRead -b|-w|-d Port# A byte (-b), word (-w), or a double\n");
40: printf(" word (-d) is read from the given port.\n");
41: printf(" Ports are numbered as 0, 1, ... relative\n");
42: printf(" to the base port set in the driver or in\n");
43: printf(" the registry. The default driver\n");
44: printf(" uses ports 300h through 303h\n");
45: printf(" All numbers are read and printed in hex.\n");
46: exit(1);
47: }
48:
49: hndFile = CreateFile(
50: "\\\\.\\GpdDev", // Open the Device "file"
51: GENERIC_READ,
52: FILE_SHARE_READ,
53: NULL,
54: OPEN_EXISTING,
55: 0,
56: NULL
57: );
58:
59: if (hndFile == INVALID_HANDLE_VALUE) // Was the device opened?
60: {
61: printf("Unable to open the device.\n");
62: exit(1);
63: }
64:
65: switch (argv[1][1])
66: {
67: case 'b':
68: IoctlCode = IOCTL_GPD_READ_PORT_UCHAR;
69: DataLength = sizeof(DataBuffer.CharData);
70: break;
71:
72: case 'w':
73: IoctlCode = IOCTL_GPD_READ_PORT_USHORT;
74: DataLength = sizeof(DataBuffer.ShortData);
75: break;
76:
77: case 'd':
78: IoctlCode = IOCTL_GPD_READ_PORT_ULONG;
79: DataLength = sizeof(DataBuffer.LongData);
80: break;
81: }
82:
83: sscanf(argv[2], "%x", &PortNumber); // Get the port number to be read
84:
85: IoctlResult = DeviceIoControl(
86: hndFile, // Handle to device
87: IoctlCode, // IO Control code for Read
88: &PortNumber, // Buffer to driver.
89: sizeof(PortNumber), // Length of buffer in bytes.
90: &DataBuffer, // Buffer from driver.
91: DataLength, // Length of buffer in bytes.
92: &ReturnedLength, // Bytes placed in DataBuffer.
93: NULL // NULL means wait till op. completes.
94: );
95:
96: if (IoctlResult) // Did the IOCTL succeed?
97: {
98: ULONG Data;
99:
100: if (ReturnedLength != DataLength)
101: {
102: printf(
103: "Ioctl transfered %d bytes, expected %d bytes\n",
104: ReturnedLength, DataLength );
105: }
106:
107: switch (ReturnedLength)
108: {
109: case sizeof(UCHAR):
110: Data = DataBuffer.CharData;
111: break;
112:
113: case sizeof(USHORT):
114: Data = DataBuffer.ShortData;
115: break;
116:
117: case sizeof(ULONG):
118: Data = DataBuffer.LongData;
119: break;
120: }
121:
122: printf("Read from port %x returned %x\n", PortNumber, Data);
123: }
124: else
125: {
126: printf("Ioctl failed with code %ld\n", GetLastError() );
127: }
128:
129:
130: if (!CloseHandle(hndFile)) // Close the Device "file".
131: {
132: printf("Failed to close device.\n");
133: }
134:
135: exit(0);
136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.