Annotation of q_a/samples/ddk/kbd_attr/kbd_attr.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     kbd_attr.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     A user mode test app demoing how to create a symbolic link
        !            12:     ( a Win32 alias that an app can spcify in CreateFile() ) for
        !            13:     a keyboard device, open the device, and send it an i/o request.
        !            14: 
        !            15: Environment:
        !            16: 
        !            17:     User mode only
        !            18: 
        !            19: Revision History:
        !            20: 
        !            21:     05-26-93 : created
        !            22: 
        !            23: --*/
        !            24: 
        !            25: #include <windows.h>
        !            26: #include <winioctl.h>
        !            27: #include <stdio.h>
        !            28: #include <stdlib.h>
        !            29: #include <ntddkbd.h>
        !            30: 
        !            31: 
        !            32: 
        !            33: int
        !            34: main(
        !            35:     IN int  argc,
        !            36:     IN char *argv[]
        !            37:     )
        !            38: /*++
        !            39: 
        !            40: Routine Description:
        !            41: 
        !            42:     Creates a symbilic link to \Device\KeyboardPort0, opens the
        !            43:     device, and send it an i/o request.
        !            44: 
        !            45: Arguments:
        !            46: 
        !            47:     argc - count of command line arguments
        !            48: 
        !            49:     argv - command line arguments
        !            50: 
        !            51: Return Value:
        !            52: 
        !            53:     1 if success
        !            54:     0 if an error occurs
        !            55: 
        !            56: --*/
        !            57: {
        !            58: 
        !            59:     int     rc = 1;  // be optomistic, assume success
        !            60:     HANDLE  hDriver;
        !            61:     DWORD   cbReturned;
        !            62:     char    deviceName[] = "KBD";
        !            63:     char    targetPath[] = "\\Device\\KeyboardClass0";
        !            64:     char    completeDeviceName[] = "\\\\.\\KBD";
        !            65: 
        !            66:     KEYBOARD_ATTRIBUTES kbdattrs;
        !            67: 
        !            68:     //
        !            69:     // The kuid=0 here corresponds to the keyboard port device # 0
        !            70:     // (e.g. \Device\KeyboardPort). We go through the keyboard
        !            71:     // class device # 0 to get to the kbd port device # 0.
        !            72:     //
        !            73: 
        !            74:     KEYBOARD_UNIT_ID_PARAMETER kuid = { 0 };
        !            75: 
        !            76: 
        !            77:     //
        !            78:     // First create a symbolic link to the NT keyboard object (number 0-
        !            79:     // there may be more than 1)
        !            80:     //
        !            81: 
        !            82:     if (DefineDosDevice (DDD_RAW_TARGET_PATH,
        !            83:                          deviceName,
        !            84:                          targetPath
        !            85:                          ))
        !            86:     {
        !            87:         printf ("\nDefinedDosDevice (%s, %s) worked\n",
        !            88:                 deviceName,
        !            89:                 targetPath
        !            90:                 );
        !            91:     }
        !            92:     else
        !            93:     {
        !            94:         printf ("\nDefinedDosDevice (%s, %s) faileded\n",
        !            95:                 deviceName,
        !            96:                 targetPath
        !            97:                 );
        !            98: 
        !            99:         return 0;
        !           100:     }
        !           101: 
        !           102: 
        !           103: 
        !           104:     //
        !           105:     // Next, try to open the device
        !           106:     //
        !           107: 
        !           108:     if ((hDriver = CreateFile (completeDeviceName,
        !           109:                                GENERIC_READ | GENERIC_WRITE,
        !           110:                                0,
        !           111:                                NULL,
        !           112:                                OPEN_EXISTING,
        !           113:                                FILE_ATTRIBUTE_NORMAL,
        !           114:                                NULL
        !           115:                                )) != ((HANDLE)-1))
        !           116: 
        !           117:         printf ("\nRetrieved valid handle for %s\n",
        !           118:                 deviceName
        !           119:                 );
        !           120: 
        !           121: 
        !           122:     else
        !           123:     {
        !           124:         printf ("Can't get a handle to %s\n",
        !           125:                 deviceName
        !           126:                 );
        !           127: 
        !           128:         rc = 0;
        !           129: 
        !           130:         goto delete_dos_device;
        !           131:     }
        !           132: 
        !           133: 
        !           134: 
        !           135:     //
        !           136:     // Send it a request
        !           137:     //
        !           138: 
        !           139:     if (DeviceIoControl (hDriver,
        !           140:                          (DWORD) IOCTL_KEYBOARD_QUERY_ATTRIBUTES,
        !           141:                          &kuid,
        !           142:                          sizeof(KEYBOARD_UNIT_ID_PARAMETER),
        !           143:                          &kbdattrs,
        !           144:                          sizeof(KEYBOARD_ATTRIBUTES),
        !           145:                          &cbReturned,
        !           146:                          0
        !           147:                          ))
        !           148:     {
        !           149:         printf ("DeviceIoControl worked\n\n");
        !           150: 
        !           151:         printf ("\tkbd_attr.KeyboardIdentifier.Type = %d\n",
        !           152:                 (int) kbdattrs.KeyboardIdentifier.Type
        !           153:                 );
        !           154: 
        !           155:         printf ("\tkbd_attr.KeyboardIdentifier.Subtype = %d\n",
        !           156:                 (int) kbdattrs.KeyboardIdentifier.Subtype
        !           157:                 );
        !           158: 
        !           159:         printf ("\tkbd_attr.KeyboardMode = %d\n",
        !           160:                 (int) kbdattrs.KeyboardMode
        !           161:                 );
        !           162: 
        !           163:         printf ("\tkbd_attr.NumberOfFunctionKeys = %d\n",
        !           164:                 (int) kbdattrs.NumberOfFunctionKeys
        !           165:                 );
        !           166: 
        !           167:         printf ("\tkbd_attr.NumberOfIndicators = %d\n",
        !           168:                 (int) kbdattrs.NumberOfIndicators
        !           169:                 );
        !           170: 
        !           171:         printf ("\tkbd_attr.NumberOfKeysTotal = %d\n",
        !           172:                 (int) kbdattrs.NumberOfKeysTotal
        !           173:                 );
        !           174: 
        !           175:         printf ("\tkbd_attr.InputDataQueueLength = %d\n",
        !           176:                 (int) kbdattrs.InputDataQueueLength
        !           177:                 );
        !           178: 
        !           179:         printf ("\tkbd_attr.KeyRepeatMinimum.UnitId = %d\n",
        !           180:                 (int) kbdattrs.KeyRepeatMinimum.UnitId
        !           181:                 );
        !           182: 
        !           183:         printf ("\tkbd_attr.KeyRepeatMinimum.Rate = %d\n",
        !           184:                 (int) kbdattrs.KeyRepeatMinimum.Rate
        !           185:                 );
        !           186: 
        !           187:         printf ("\tkbd_attr.KeyRepeatMinimum.Delay = %d\n",
        !           188:                 (int) kbdattrs.KeyRepeatMinimum.Delay
        !           189:                 );
        !           190: 
        !           191:         printf ("\tkbd_attr.KeyRepeatMaximum.UnitId = %d\n",
        !           192:                 (int) kbdattrs.KeyRepeatMaximum.UnitId
        !           193:                 );
        !           194: 
        !           195:         printf ("\tkbd_attr.KeyRepeatMaximum.Rate = %d\n",
        !           196:                 (int) kbdattrs.KeyRepeatMaximum.Rate
        !           197:                 );
        !           198: 
        !           199:         printf ("\tkbd_attr.KeyRepeatMaximum.Delay = %d\n",
        !           200:                 (int) kbdattrs.KeyRepeatMaximum.Delay
        !           201:                 );
        !           202:     }
        !           203:     else
        !           204:     {
        !           205:         DWORD err = GetLastError();
        !           206: 
        !           207:         printf ("DeviceIoControl failed, err = %d\n(%x)\n",
        !           208:                 err,
        !           209:                 err
        !           210:                 );
        !           211: 
        !           212:         rc = 0;
        !           213:     }
        !           214: 
        !           215: 
        !           216: 
        !           217:     //
        !           218:     // Clean up
        !           219:     //
        !           220: 
        !           221:     CloseHandle(hDriver);
        !           222: 
        !           223: delete_dos_device:
        !           224: 
        !           225:     DefineDosDevice (DDD_REMOVE_DEFINITION,
        !           226:                      deviceName,
        !           227:                      NULL
        !           228:                      );
        !           229: 
        !           230:     return rc;
        !           231: }

unix.superglobalmegacorp.com

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