windows-nt/Source/XPSP1/NT/base/pnp/tools/dock/dock.c
2020-09-26 16:20:57 +08:00

404 lines
11 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
locate.c
Abstract:
This module contains the code
for finding, adding, removing, and identifying hid devices.
Environment:
Kernel & user mode
Revision History:
Nov-96 : Created by Kenneth D. Ray
--*/
#include <basetyps.h>
#include <stdlib.h>
#include <wtypes.h>
#include <cfgmgr32.h>
#include <initguid.h>
#include <stdio.h>
#include <winioctl.h>
#include "dock.h"
#define USAGE "Usage: dock [-e] [-v] [-f]\n" \
"\t -e eject dock\n" \
"\t -v verbose\n" \
"\t -f force\n"
VOID
DockStartEject (
BOOLEAN Verbose,
BOOLEAN Force
);
__cdecl
main (
ULONG argc,
CHAR *argv[]
)
/*++
++*/
{
BOOLEAN eject = FALSE;
BOOLEAN verbose = FALSE;
BOOLEAN force = FALSE;
BOOLEAN error = FALSE;
ULONG i;
char * parameter = NULL;
//
// parameter parsing follows:
//
try {
if (argc < 2) {
leave;
}
for (i = 1; i < argc; i++) {
parameter = argv[i];
if ('-' == *(parameter ++)) {
switch (*parameter) {
case 'e':
eject = TRUE;
break;
case 'v':
verbose = TRUE;
break;
case 'f':
force = TRUE;
break;
default:
error = TRUE;
leave;
}
} else {
error = TRUE;
leave;
}
}
} finally {
if (error || ((!eject) && (!verbose))) {
printf (USAGE);
exit (1);
}
if (verbose) {
printf ("Verbose Mode Requested \n");
}
if (eject) {
printf ("Eject Requested \n");
DockStartEject (verbose, force);
}
}
printf("Done\n");
return 0;
}
VOID
DockStartEject (
BOOLEAN Verbose,
BOOLEAN Force
)
/*++
--*/
{
CONFIGRET status;
BOOL present;
if (Verbose) {
printf("Checking if Dock Present\n");
}
status = CM_Is_Dock_Station_Present (&present);
if (Verbose) {
printf("ret 0x%x, Present %s\n",
status,
(present ? "TRUE" : "FALSE"));
}
if (Force || present) {
if (Verbose) {
printf("Calling eject\n");
}
status = CM_Request_Eject_PC ();
if (Verbose) {
printf("ret 0x%x\n", status);
}
} else {
printf("Skipping eject call\n");
}
}
#if 0
BOOLEAN
OpenGamePort (
IN HDEVINFO HardwareDeviceInfo,
IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData,
IN OUT PGAME_PORT GamePort
);
BOOLEAN
FindKnownGamePorts (
OUT PGAME_PORT * GamePorts, // A array of struct _GAME_PORT.
OUT PULONG NumberDevices // the length in elements of this array.
)
/*++
Routine Description:
Do the required PnP things in order to find, the all the HID devices in
the system at this time.
--*/
{
HDEVINFO hardwareDeviceInfo;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
ULONG i;
BOOLEAN done;
PGAME_PORT gamePortInst;
LPGUID gamePortGuid;
gamePortGuid = (LPGUID) &GUID_GAMEENUM_BUS_ENUMERATOR;
*GamePorts = NULL;
*NumberDevices = 0;
//
// Open a handle to the plug and play dev node.
//
hardwareDeviceInfo = SetupDiGetClassDevs (
gamePortGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_INTERFACEDEVICE)); // Function class devices.
//
// Take a wild guess to start
//
*NumberDevices = 4;
done = FALSE;
deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
i=0;
while (!done) {
*NumberDevices *= 2;
if (*GamePorts) {
*GamePorts =
realloc (*GamePorts, (*NumberDevices * sizeof (GAME_PORT)));
} else {
*GamePorts = calloc (*NumberDevices, sizeof (GAME_PORT));
}
if (NULL == *GamePorts) {
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
return FALSE;
}
gamePortInst = *GamePorts + i;
for (; i < *NumberDevices; i++, gamePortInst++) {
if (SetupDiEnumInterfaceDevice (hardwareDeviceInfo,
0, // No care about specific PDOs
gamePortGuid,
i,
&deviceInfoData)) {
if( !OpenGamePort (hardwareDeviceInfo, &deviceInfoData, gamePortInst) )
printf("Error: OpenGamePort returned FALSE\n");
} else {
if (ERROR_NO_MORE_ITEMS == GetLastError()) {
done = TRUE;
break;
}
}
}
}
*NumberDevices = i;
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
return TRUE;
}
BOOLEAN
OpenGamePort (
IN HDEVINFO HardwareDeviceInfo,
IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData,
IN OUT PGAME_PORT GamePort
)
/*++
RoutineDescription:
Given the HardwareDeviceInfo, representing a handle to the plug and
play information, and deviceInfoData, representing a specific hid device,
open that device and fill in all the relivant information in the given
HID_DEVICE structure.
return if the open and initialization was successfull or not.
--*/
{
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
ULONG i, bytes;
GAMEENUM_REMOVE_HARDWARE remove;
//
// allocate a function class device data structure to receive the
// goods about this particular device.
//
SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL); // not interested in the specific dev-node
predictedLength = requiredLength;
// sizeof (SP_FNCLASS_DEVICE_DATA) + 512;
functionClassDeviceData = malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
//
// Retrieve the information from Plug and Play.
//
if (! SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL)) {
printf("Error in SetupDiGetInterfaceDeviceDetail\n");
free (functionClassDeviceData);
return FALSE;
}
printf("Opening %s\n", functionClassDeviceData->DevicePath);
GamePort->File = CreateFile (
functionClassDeviceData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
0, // FILE_SHARE_READ | FILE_SHARE_WRITE
NULL, // no SECURITY_ATTRIBUTES structure
OPEN_EXISTING, // No special create flags
0, // No special attributes
NULL); // No template file
if (INVALID_HANDLE_VALUE == GamePort->File) {
printf("Error in CreateFile: %x", GetLastError());
free (functionClassDeviceData);
return FALSE;
}
printf("File Opened!!!\n");
GamePort->Desc.Size = sizeof (GamePort->Desc);
if (!DeviceIoControl (GamePort->File,
IOCTL_GAMEENUM_PORT_DESC,
&GamePort->Desc, sizeof (GamePort->Desc),
&GamePort->Desc, sizeof (GamePort->Desc),
&bytes, NULL)) {
printf("Error in DeviceIoctl IOCTL_GAMEENUM_PORT_DESC: %x", GetLastError());
free (functionClassDeviceData);
return FALSE;
}
printf("Description: Size (%d), Handle (0x%x), Address (0x%x) \n",
GamePort->Desc.Size,
GamePort->Desc.PortHandle,
GamePort->Desc.PortAddress);
//
// Set the port up
//
if(bExpose) {
printf("\nThis handle is not valid for remove!!!\n\nExposing port\n");
GamePort->Hardware = malloc (bytes = (sizeof (GAMEENUM_EXPOSE_HARDWARE) +
GAME_HARDWARE_IDS_LENGTH));
GamePort->Hardware->Size = sizeof (GAMEENUM_EXPOSE_HARDWARE);
GamePort->Hardware->PortHandle = GamePort->Desc.PortHandle;
printf("Enter Number of Joysticks:");
scanf("%d",&GamePort->Hardware->NumberJoysticks);
printf("Enter Number of Buttons:");
scanf("%d", &GamePort->Hardware->NumberButtons);
printf("Enter Number of Axes:");
scanf("%d", &GamePort->Hardware->NumberAxis);
memcpy (GamePort->Hardware->HardwareIDs,
GAME_HARDWARE_IDS,
GAME_HARDWARE_IDS_LENGTH);
if (!DeviceIoControl (GamePort->File,
IOCTL_GAMEENUM_EXPOSE_HARDWARE,
GamePort->Hardware, bytes,
GamePort->Hardware, bytes,
&bytes, NULL)) {
free (functionClassDeviceData);
free (GamePort->Hardware);
GamePort->Hardware = NULL;
printf("Error in DeviceIoctl IOCTL_GAMEENUM_EXPOSE_HARDWARE: 0x%x\n", GetLastError());
return FALSE;
}
printf("Hardware handle 0x%x <----- Save this handle!!!\n",GamePort->Hardware->HardwareHandle);
printf("\t\tGameEnum -r will not be able retrieve it for you.\n");
free (GamePort->Hardware);
GamePort->Hardware = NULL;
}
if(bRemove) {
printf("Removing port\n");
remove.Size = bytes = sizeof (remove);
printf("Enter hardware handle: ");
scanf("%x",&remove.HardwareHandle);
printf("Entered Handle: %x", remove.HardwareHandle);
if (!DeviceIoControl (GamePort->File,
IOCTL_GAMEENUM_REMOVE_HARDWARE,
&remove, bytes,
&remove, bytes,
&bytes, NULL)) {
printf("Error in DeviceIoctl IOCTL_GAMEENUM_REMOVE_HARDWARE: 0x%x\n", GetLastError());
return FALSE;
}
}
free (functionClassDeviceData);
return TRUE;
}
#endif