Sample Code

Windows Driver Samples/ PortIO Sample Driver/ C++/ gpdread/ Gpdread.c/

/*++

Copyright (c) 1990-2000 Microsoft Corporation, All Rights Reserved

Module Name:

    gpdread.c

Abstract:

    Read a byte from a port using the genport driver.


Environment:

    User mode

--*/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <winioctl.h>
#include "gpioctl.h"        // This defines the IOCTL constants.
#include <dontuse.h>

VOID __cdecl
main(
    _In_ ULONG argc,
    _In_reads_(argc) PCHAR argv[]
    )
{

    // The following is returned by IOCTL.  It is true if the read succeeds.
    BOOL    IoctlResult;

    // The following parameters are used in the IOCTL call
    HANDLE  hndFile;            // Handle to device, obtain from CreateFile
    ULONG   PortNumber;         // Buffer sent to the driver (Port #).
    union   {
        ULONG   LongData;
        USHORT  ShortData;
        UCHAR   CharData;
    }   DataBuffer;             // Buffer received from driver (Data).
    LONG    IoctlCode;
    ULONG   DataLength;
    DWORD   ReturnedLength;     // Number of bytes returned

    // The input buffer is a ULONG containing the port address.

    // The port data is returned in the output buffer DataBuffer;

    if ( argc < 3 || argv[1][0] != '-' ||
         ( argv[1][1] != 'b' && argv[1][1] != 'w' && argv[1][1] != 'd' ) )
    {
        printf("GpdRead -b|-w|-d Port#  A byte (-b), word (-w), or a double\n");
        printf("                        word (-d) is read from the given port.\n");
        printf("                        Ports are numbered as 0, 1, ... relative\n");
        printf("                        to the base port assinged to the driver\n");
        printf("                        by PNP manager according to the driver preferences\n");
        printf("                        in the INF file. All numbers are read and printed in hex.\n");
        exit(1);
    }

    hndFile = CreateFile(
                "\\\\.\\GpdDev",                    // Open the Device "file"
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                0,
                NULL
                );

    if (hndFile == INVALID_HANDLE_VALUE)        // Was the device opened?
    {
        printf("Unable to open the device.\n");
        exit(1);
    }

    switch (argv[1][1])
    {
        case 'b':
            IoctlCode = IOCTL_GPD_READ_PORT_UCHAR;
            DataLength = sizeof(DataBuffer.CharData);
            break;

        case 'w':
            IoctlCode = IOCTL_GPD_READ_PORT_USHORT;
            DataLength = sizeof(DataBuffer.ShortData);
            break;

        case 'd':
            IoctlCode = IOCTL_GPD_READ_PORT_ULONG;
            DataLength = sizeof(DataBuffer.LongData);
            break;
       default:
            printf("Invalid command line argument %c\n", argv[1][1]);
            exit(1);

    }

    if (sscanf_s(argv[2], "%x", &PortNumber) == 0){ // Get the port number to be read
        printf("sscanf_s failed\n");
        exit(1);
    }

    IoctlResult = DeviceIoControl(
                            hndFile,            // Handle to device
                            IoctlCode,          // IO Control code for Read
                            &PortNumber,        // Buffer to driver.
                            sizeof(PortNumber), // Length of buffer in bytes.
                            &DataBuffer,        // Buffer from driver.
                            DataLength,         // Length of buffer in bytes.
                            &ReturnedLength,    // Bytes placed in DataBuffer.
                            NULL                // NULL means wait till op. completes.
                            );

    if (IoctlResult)                            // Did the IOCTL succeed?
    {
        ULONG   Data;

        if (ReturnedLength != DataLength)
        {
            printf(
                "Ioctl transfered %d bytes, expected %d bytes\n",
                ReturnedLength, DataLength );
        }

        switch (ReturnedLength)
        {
            case sizeof(UCHAR):
                Data = DataBuffer.CharData;
                break;

            case sizeof(USHORT):
                Data = DataBuffer.ShortData;
                break;

            case sizeof(ULONG):
                Data = DataBuffer.LongData;
                break;
            default:
                printf("Invalid return value from the DeviceIoControl\n");
                exit(1);

        }

        printf("Read from port %x returned %x\n", PortNumber, Data);
    }
    else
    {
        printf("Ioctl failed with code %ld\n", GetLastError() );
    }


    if (!CloseHandle(hndFile))                  // Close the Device "file".
    {
        printf("Failed to close device.\n");
    }

    exit(0);
}


Our Services

  • What our customers say about us?

© 2011-2024 All Rights Reserved. Joya Systems. 4425 South Mopac Building II Suite 101 Austin, TX 78735 Tel: 800-DEV-KERNEL

Privacy Policy. Terms of use. Valid XHTML & CSS