/*++ 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 #include #include #include #include #include #include #include // // 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; }