You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.1 KiB
153 lines
3.1 KiB
/*++
|
|
|
|
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;
|
|
}
|