Annotation of q_a/samples/ddk/portio/gpdwrite.c, revision 1.1

1.1     ! root        1: // Write a byte to an port using the wkd driver.
        !             2: // Robert R. Howell             January 6, 1993
        !             3: // Robert B. Nelson (Microsoft) January 12, 1993
        !             4: // Robert B. Nelson (Microsoft) April 5, 1993
        !             5: // Robert B. Nelson (Microsoft) May 6, 1993
        !             6: 
        !             7: #include <windows.h>
        !             8: #include <stddef.h>
        !             9: #include <stdio.h>
        !            10: #include <stdlib.h>
        !            11: #include <winioctl.h>
        !            12: #include "gpioctl.h"        // This defines the IOCTL constants.
        !            13: 
        !            14: void main(int argc, char **argv)
        !            15: {
        !            16: 
        !            17:     // The following is returned by IOCTL.  It is true if the write succeeds.
        !            18:     BOOL    IoctlResult;
        !            19: 
        !            20:     // The following parameters are used in the IOCTL call
        !            21:     HANDLE              hndFile;        // Handle to device, obtain from CreateFile
        !            22:     GENPORT_WRITE_INPUT InputBuffer;    // Input buffer for DeviceIoControl
        !            23:     LONG                IoctlCode;
        !            24:     ULONG               DataValue;
        !            25:     ULONG               DataLength;
        !            26:     ULONG               ReturnedLength; // Number of bytes returned in output buffer
        !            27: 
        !            28: 
        !            29:     if (argc < 4)
        !            30:     {
        !            31:         printf("GpdWrite -b|-w|-d <Port#> <Value>\n\n");
        !            32:         printf("        The byte (-b), word (-w), or doubleword (-d) specified\n");
        !            33:         printf("        as value is written to the given port.  Ports are numbered\n");
        !            34:         printf("        as 0, 1, ... relative to the base set in the driver or\n");
        !            35:         printf("        the registry.  The default driver uses ports 300h through\n");
        !            36:         printf("        303h.  All numbers are read in hex.\n");
        !            37:         exit(1);
        !            38:     }
        !            39: 
        !            40: 
        !            41:     hndFile = CreateFile(
        !            42:                     "\\\\.\\GpdDev",           // Open the Device "file"
        !            43:                     GENERIC_WRITE,
        !            44:                     FILE_SHARE_WRITE,
        !            45:                     NULL,
        !            46:                     OPEN_EXISTING,
        !            47:                     0,
        !            48:                     NULL);
        !            49: 
        !            50:     if (hndFile == INVALID_HANDLE_VALUE)        // Was the device opened?
        !            51:     {
        !            52:         printf("Unable to open the device.\n");
        !            53:         exit(1);
        !            54:     }
        !            55: 
        !            56:     sscanf(argv[2], "%x", &InputBuffer.PortNumber);     // Get the port number
        !            57:     sscanf(argv[3], "%x", &DataValue);          // Get the data to be written.
        !            58: 
        !            59:     switch (argv[1][1])
        !            60:     {
        !            61:         case 'b':
        !            62:             IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR;
        !            63:             InputBuffer.CharData = (UCHAR)DataValue;
        !            64:             DataLength = offsetof(GENPORT_WRITE_INPUT, CharData) +
        !            65:                          sizeof(InputBuffer.CharData);
        !            66:             break;
        !            67:             
        !            68:         case 'w':
        !            69:             IoctlCode = IOCTL_GPD_WRITE_PORT_USHORT;
        !            70:             InputBuffer.ShortData = (USHORT)DataValue;
        !            71:             DataLength = offsetof(GENPORT_WRITE_INPUT, ShortData) +
        !            72:                          sizeof(InputBuffer.ShortData);
        !            73:             break;
        !            74: 
        !            75:         case 'd':
        !            76:             IoctlCode = IOCTL_GPD_WRITE_PORT_ULONG;
        !            77:             InputBuffer.LongData = (ULONG)DataValue;
        !            78:             DataLength = offsetof(GENPORT_WRITE_INPUT, LongData) +
        !            79:                          sizeof(InputBuffer.LongData);
        !            80:             break;
        !            81:     }
        !            82: 
        !            83:     IoctlResult = DeviceIoControl(
        !            84:                         hndFile,                // Handle to device
        !            85:                         IoctlCode,              // IO Control code for Write
        !            86:                         &InputBuffer,           // Buffer to driver.  Holds port & data.
        !            87:                         DataLength,             // Length of buffer in bytes.
        !            88:                         NULL,                   // Buffer from driver.   Not used.
        !            89:                         0,                      // Length of buffer in bytes.
        !            90:                         &ReturnedLength,        // Bytes placed in outbuf.  Should be 0.
        !            91:                         NULL                    // NULL means wait till I/O completes.
        !            92:                         );
        !            93: 
        !            94: 
        !            95:     if (IoctlResult)                            // Did the IOCTL succeed?
        !            96:     {
        !            97:         printf(
        !            98:             "Wrote to port %x the data %x\n",
        !            99:             InputBuffer.PortNumber, DataValue);
        !           100:     }
        !           101:     else
        !           102:     {
        !           103:         printf(
        !           104:             "Ioctl failed with code %ld\n", GetLastError() );
        !           105:     }
        !           106: 
        !           107: 
        !           108:     if (!CloseHandle(hndFile))                  // Close the Device "file".
        !           109:     {
        !           110:         printf("Failed to close device.\n");
        !           111:     }
        !           112: 
        !           113:     exit(0);
        !           114: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.