154 lines
3 KiB
C
154 lines
3 KiB
C
/*++
|
||
|
||
Copyright (c) 1990 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Wperf.c
|
||
|
||
Abstract:
|
||
|
||
Win32 application to display performance statictics.
|
||
|
||
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>
|
||
|
||
|
||
//
|
||
// global handles
|
||
//
|
||
|
||
UCHAR Usage[] = "ec: r addr len\n w addr value";
|
||
HANDLE DriverHandle;
|
||
UCHAR Buffer[256];
|
||
|
||
|
||
//
|
||
// Prototypes
|
||
//
|
||
|
||
BOOLEAN
|
||
InitDriver ();
|
||
|
||
|
||
|
||
int
|
||
__cdecl
|
||
main(USHORT argc, CHAR **argv)
|
||
{
|
||
BOOLEAN Write;
|
||
ULONG Offset, Value;
|
||
ULONG l, bw;
|
||
|
||
//
|
||
// Locate pentium perf driver
|
||
//
|
||
|
||
if (!InitDriver ()) {
|
||
printf ("acpiec.sys is not installed\n");
|
||
exit (1);
|
||
}
|
||
|
||
//
|
||
// Check args
|
||
//
|
||
|
||
if (argc < 3) {
|
||
printf (Usage);
|
||
exit (1);
|
||
}
|
||
|
||
switch (argv[1][0]) {
|
||
case 'r': Write = FALSE; break;
|
||
case 'w': Write = TRUE; break;
|
||
default: printf (Usage); exit(1);
|
||
}
|
||
|
||
Offset = atoi(argv[2]);
|
||
if (Offset > 255) {
|
||
printf ("ec: Offset must be 0-255\n");
|
||
exit (1);
|
||
}
|
||
|
||
Value = atoi(argv[3]);
|
||
if (Value > 255) {
|
||
printf ("ec: len/value must be 0-255\n");
|
||
exit (1);
|
||
}
|
||
|
||
l = SetFilePointer (DriverHandle, Offset, NULL, FILE_BEGIN);
|
||
if (l == -1) {
|
||
printf ("ec: Could not set file pointer\n");
|
||
exit (1);
|
||
}
|
||
|
||
if (Write) {
|
||
if (!WriteFile(DriverHandle, &Value, 1, &bw, NULL)) {
|
||
printf ("ec: Write error\n");
|
||
exit (1);
|
||
}
|
||
} else {
|
||
if (!ReadFile(DriverHandle, Buffer, Value, &bw, NULL)) {
|
||
printf ("ec: Read error\n");
|
||
exit (1);
|
||
}
|
||
|
||
for (l=0; l < Value; l++) {
|
||
printf ("%3d: %d\n", Offset + l, Buffer[l]);
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
BOOLEAN
|
||
InitDriver ()
|
||
{
|
||
UNICODE_STRING DriverName;
|
||
NTSTATUS status;
|
||
OBJECT_ATTRIBUTES ObjA;
|
||
IO_STATUS_BLOCK IOSB;
|
||
SYSTEM_BASIC_INFORMATION BasicInfo;
|
||
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION PPerfInfo;
|
||
int i;
|
||
|
||
RtlInitUnicodeString(&DriverName, L"\\Device\\ACPIEC");
|
||
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
|
||
);
|
||
|
||
return NT_SUCCESS(status) ? TRUE : FALSE;
|
||
}
|