windows-nt/Source/XPSP1/NT/base/busdrv/acpi/cmbatt/testapp/cmbattst.c
2020-09-26 16:20:57 +08:00

321 lines
8.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
Abstract:
Author:
Ken Reneris
Environment:
console
--*/
//
// set variable to define global variables
//
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <errno.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <poclass.h>
//
// global handles
//
UCHAR Usage[] = "batt: \n";
HANDLE DriverHandle;
ULONG BatteryTag;
#define RANGE 1
//
// Prototypes
//
BOOLEAN
InitDriver ( CHAR *NamePtr );
int
Nib (
UCHAR c
)
{
if (c >= '0' && c <= '9') {
return c - '0';
}
if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
printf ("Invalid hex value\n");
return 0;
}
int
htoi (
PUCHAR s
)
{
ULONG i;
UCHAR c;
i = Nib(s[0]);
if (s[1]) {
i = i << 4 | Nib(s[1]);
}
return i;
}
VOID
GetBatteryTag (
VOID
)
{
NTSTATUS Status;
IO_STATUS_BLOCK IOSB;
Status = NtDeviceIoControlFile(
DriverHandle,
(HANDLE) NULL, // event
(PIO_APC_ROUTINE) NULL,
(PVOID) NULL,
&IOSB,
IOCTL_BATTERY_QUERY_TAG,
NULL, // input buffer
0,
&BatteryTag, // output buffer
sizeof (BatteryTag)
);
if (!NT_SUCCESS(Status)) {
printf ("Battery tag not available. Status = %x\n", Status);
BatteryTag = 0xffffffff;
}
}
VOID
GetBatteryInfo (
IN BATTERY_QUERY_INFORMATION_LEVEL Level,
IN PVOID Buffer,
IN ULONG BufferLength
)
{
NTSTATUS Status;
IO_STATUS_BLOCK IOSB;
BATTERY_QUERY_INFORMATION BInfo;
memset (Buffer, 0, BufferLength);
BInfo.BatteryTag = BatteryTag;
BInfo.InformationLevel = Level;
Status = NtDeviceIoControlFile(
DriverHandle,
(HANDLE) NULL, // event
(PIO_APC_ROUTINE) NULL,
(PVOID) NULL,
&IOSB,
IOCTL_BATTERY_QUERY_INFORMATION,
&BInfo, // input buffer
sizeof (BInfo),
Buffer, // output buffer
BufferLength
);
if (!NT_SUCCESS(Status)) {
printf ("Query battery information failed. Level %x. Status = %x\n", Level, Status);
}
}
VOID
GetBatteryStatus (
IN PBATTERY_WAIT_STATUS WaitStatus,
OUT PBATTERY_STATUS BatteryStatus
)
{
NTSTATUS Status;
IO_STATUS_BLOCK IOSB;
memset (BatteryStatus, 0xAB, sizeof(BatteryStatus));
Status = NtDeviceIoControlFile(
DriverHandle,
(HANDLE) NULL, // event
(PIO_APC_ROUTINE) NULL,
(PVOID) NULL,
&IOSB,
IOCTL_BATTERY_QUERY_STATUS,
WaitStatus, // input buffer
sizeof (BATTERY_WAIT_STATUS),
BatteryStatus, // output buffer
sizeof (BATTERY_STATUS)
);
if (!NT_SUCCESS(Status)) {
printf ("Query battery status failed. Status = %x\n", Status);
return ;
}
// dump battery status
printf ("Power State.........: %08x\n", BatteryStatus->PowerState);
printf ("Capacity............: %08x %d\n", BatteryStatus->Capacity, BatteryStatus->Capacity);
printf ("Voltage.............: %08x %d\n", BatteryStatus->Voltage, BatteryStatus->Voltage);
printf ("Current.,,,,,,,,,...: %08x %d\n", BatteryStatus->Current, BatteryStatus->Current);
printf ("\n");
}
int
__cdecl
main(USHORT argc, CHAR **argv)
{
ULONG BattTag;
BATTERY_INFORMATION BInfo;
ULONG BETime;
WCHAR BDeviceName[50];
UCHAR BManDate[50];
WCHAR BManName[50];
ULONG BETemp;
WCHAR BEUID [50];
ULONG BEGran[4];
BATTERY_WAIT_STATUS WStat;
BATTERY_STATUS BStat;
CHAR *NamePtr;
if (argc > 1) {
NamePtr=argv[1];
} else {
NamePtr = "CmBatt";
}
//
// Locate pentium perf driver
//
if (!InitDriver (NamePtr)) {
printf ("CmBatt not found\n");
exit (1);
}
GetBatteryTag ();
printf ("Battery Tag.........: %x\n", BatteryTag);
//
// Get generic info
//
GetBatteryInfo (BatteryInformation, &BInfo, sizeof(BInfo));
GetBatteryInfo (BatteryEstimatedTime, &BETime, sizeof(BETime));
GetBatteryInfo (BatteryDeviceName, BDeviceName, sizeof(BDeviceName));
GetBatteryInfo (BatteryManufactureDate, BManDate, sizeof(BManDate));
GetBatteryInfo (BatteryManufactureName, BManName, sizeof(BManName));
GetBatteryInfo (BatteryTemperature, &BETemp, sizeof(BETemp));
GetBatteryInfo (BatteryUniqueID, BEUID, sizeof(BEUID));
GetBatteryInfo (BatteryGranularityInformation, BEGran, sizeof(BEGran));
// dump it...
printf ("Capabilities........: %08x\n", BInfo.Capabilities);
printf ("Technology..........: %02x\n", BInfo.Technology);
printf ("Chemisttry..........: %4.4s\n", BInfo.Chemistry);
printf ("Designed Capacity...: %08x\n", BInfo.DesignedCapacity);
printf ("FullCharged Capacity: %08x\n", BInfo.FullChargedCapacity);
printf ("Default Alert1......: %08x\n", BInfo.DefaultAlert1);
printf ("Default Alert2......: %08x\n", BInfo.DefaultAlert2);
printf ("Critical Bias.......: %08x\n", BInfo.CriticalBias);
printf ("Cycle Count.........: %08x\n", BInfo.CycleCount);
printf ("Granularity.........: %x %x %x %x\n", BEGran[0], BEGran[1], BEGran[2], BEGran[3]);
printf ("Temapture...........: %08x\n", BETemp);
wprintf (L"Unique ID...........: %s\n", BEUID);
printf ("Estimated Time......: %08x\n", BETime);
wprintf (L"Device Name.........: %s\n", BDeviceName);
printf ("Manufacture Date....: %d %d %d %d\n", BManDate[0], BManDate[1], BManDate[2], BManDate[3]);
wprintf (L"Manufacture Name....: %s\n", BManName);
printf ("\n");
memset (&WStat, 0, sizeof(WStat));
WStat.BatteryTag = BatteryTag;
GetBatteryStatus (&WStat, &BStat);
// Now that we've got the state, let's perform a long term status change request
WStat.PowerState = BStat.PowerState;
WStat.LowCapacity = BStat.Capacity - RANGE;
WStat.HighCapacity = BStat.Capacity + RANGE;
WStat.Timeout = 50000000; // 5 min
GetBatteryStatus (&WStat, &BStat);
}
BOOLEAN
InitDriver (
CHAR *NamePtr
)
{
UNICODE_STRING DriverName;
ANSI_STRING AnsiName;
NTSTATUS status;
OBJECT_ATTRIBUTES ObjA;
IO_STATUS_BLOCK IOSB;
UCHAR strbuf[100];
sprintf (strbuf, "\\Device\\%s",NamePtr);
RtlInitAnsiString(&AnsiName, strbuf);
RtlAnsiStringToUnicodeString(&DriverName, &AnsiName, TRUE);
InitializeObjectAttributes(
&ObjA,
&DriverName,
OBJ_CASE_INSENSITIVE,
0,
0 );
status = NtOpenFile (
&DriverHandle, // return handle
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA, // desired access
&ObjA, // Object
&IOSB, // io status block
FILE_SHARE_READ | FILE_SHARE_WRITE, // share access
FILE_SYNCHRONOUS_IO_ALERT // open options
);
if (!NT_SUCCESS(status)) {
printf ("Device name %s Error %x\n", strbuf, status);
return FALSE;
} else {
printf ("Opened Device name %s\n", strbuf);
return TRUE;
}
}