519 lines
15 KiB
C
519 lines
15 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
diskperf.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Program to display and/or update the current value of the Diskperf
|
|||
|
driver startup value
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bob Watson (a-robw) 4 Dec 92
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
#include <nt.h>
|
|||
|
#include <ntrtl.h>
|
|||
|
#include <nturtl.h>
|
|||
|
#include <ntconfig.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
#include "diskperf.h" // include text string id constancts
|
|||
|
|
|||
|
#define SWITCH_CHAR '-' // is there a system call to get this?
|
|||
|
#define ENABLE_CHAR 'Y' // command will be upcased
|
|||
|
#define DISABLE_CHAR 'N'
|
|||
|
#define ENHANCED_CHAR 'E'
|
|||
|
|
|||
|
#define LOCAL_CHANGE 2 // number of commands in a local change command
|
|||
|
#define REMOTE_CHANGE 3 // number of commands in a remote change command
|
|||
|
|
|||
|
//
|
|||
|
// note these values are arbitrarily based on the whims of the people
|
|||
|
// developing the disk drive drivers that belong to the "Filter" group.
|
|||
|
//
|
|||
|
#define TAG_NORMAL 4 // diskperf starts AFTER ftdisk
|
|||
|
#define TAG_ENHANCED 2 // diskperf starts BEFORE ftdisk
|
|||
|
|
|||
|
const LPTSTR lpwszDiskPerfKey = TEXT("SYSTEM\\CurrentControlSet\\Services\\Diskperf");
|
|||
|
|
|||
|
#define REG_TO_DP_INDEX(reg_idx) (DP_LOAD_STATUS_BASE + (\
|
|||
|
(reg_idx == SERVICE_BOOT_START) ? DP_BOOT_START : \
|
|||
|
(reg_idx == SERVICE_SYSTEM_START) ? DP_SYSTEM_START : \
|
|||
|
(reg_idx == SERVICE_AUTO_START) ? DP_AUTO_START : \
|
|||
|
(reg_idx == SERVICE_DEMAND_START) ? DP_DEMAND_START : \
|
|||
|
(reg_idx == SERVICE_DISABLED) ? DP_NEVER_START : DP_UNDEFINED))
|
|||
|
|
|||
|
#define MAX_MACHINE_NAME_LEN 32
|
|||
|
|
|||
|
// command line arguments
|
|||
|
|
|||
|
#define CMD_SHOW_LOCAL_STATUS 1
|
|||
|
#define CMD_DO_COMMAND 2
|
|||
|
|
|||
|
#define ArgIsSystem(arg) (*(arg) == '\\' ? TRUE : FALSE)
|
|||
|
|
|||
|
//
|
|||
|
// global buffer for help text display strings
|
|||
|
//
|
|||
|
#define DISP_BUFF_LEN 256
|
|||
|
#define NUM_STRING_BUFFS 2
|
|||
|
LPCTSTR BlankString = TEXT(" ");
|
|||
|
LPCTSTR StartKey = TEXT("Start");
|
|||
|
LPCTSTR TagKey = TEXT("Tag");
|
|||
|
LPCTSTR EmptyString = TEXT("");
|
|||
|
|
|||
|
HINSTANCE hMod = NULL;
|
|||
|
DWORD dwLastError;
|
|||
|
|
|||
|
|
|||
|
LPCTSTR
|
|||
|
GetStringResource (
|
|||
|
UINT wStringId
|
|||
|
)
|
|||
|
{
|
|||
|
static TCHAR DisplayStringBuffer[NUM_STRING_BUFFS][DISP_BUFF_LEN];
|
|||
|
static DWORD dwBuffIndex;
|
|||
|
LPTSTR szReturnBuffer;
|
|||
|
|
|||
|
dwBuffIndex++;
|
|||
|
dwBuffIndex %= NUM_STRING_BUFFS;
|
|||
|
szReturnBuffer = (LPTSTR)&DisplayStringBuffer[dwBuffIndex][0];
|
|||
|
|
|||
|
if (!hMod) {
|
|||
|
hMod = (HINSTANCE)GetModuleHandle(NULL); // get instance ID of this module;
|
|||
|
}
|
|||
|
|
|||
|
if (hMod) {
|
|||
|
if ((LoadString(hMod, wStringId, szReturnBuffer, DISP_BUFF_LEN)) > 0) {
|
|||
|
return (LPCTSTR)szReturnBuffer;
|
|||
|
} else {
|
|||
|
dwLastError = GetLastError();
|
|||
|
return EmptyString;
|
|||
|
}
|
|||
|
} else {
|
|||
|
return EmptyString;
|
|||
|
}
|
|||
|
}
|
|||
|
LPCTSTR
|
|||
|
GetFormatResource (
|
|||
|
UINT wStringId
|
|||
|
)
|
|||
|
{
|
|||
|
static TCHAR TextFormat[DISP_BUFF_LEN];
|
|||
|
|
|||
|
if (!hMod) {
|
|||
|
hMod = (HINSTANCE)GetModuleHandle(NULL); // get instance ID of this module;
|
|||
|
}
|
|||
|
|
|||
|
if (hMod) {
|
|||
|
if ((LoadString(hMod, wStringId, TextFormat, DISP_BUFF_LEN)) > 0) {
|
|||
|
return (LPCTSTR)&TextFormat[0];
|
|||
|
} else {
|
|||
|
dwLastError = GetLastError();
|
|||
|
return BlankString;
|
|||
|
}
|
|||
|
} else {
|
|||
|
return BlankString;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
DisplayChangeCmd (
|
|||
|
)
|
|||
|
{
|
|||
|
UINT wID;
|
|||
|
TCHAR OemDisplayStringBuffer[DISP_BUFF_LEN * 2];
|
|||
|
TCHAR DisplayStringBuffer[DISP_BUFF_LEN];
|
|||
|
|
|||
|
if (hMod) {
|
|||
|
if ((LoadString(hMod, DP_TEXT_FORMAT, DisplayStringBuffer, DISP_BUFF_LEN)) > 0) {
|
|||
|
for (wID=DP_CMD_HELP_START; wID <= DP_CMD_HELP_END; wID++) {
|
|||
|
if ((LoadString(hMod, wID, DisplayStringBuffer, DISP_BUFF_LEN)) > 0) {
|
|||
|
CharToOem (DisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
VOID
|
|||
|
DisplayCmdHelp(
|
|||
|
)
|
|||
|
{
|
|||
|
UINT wID;
|
|||
|
TCHAR OemDisplayStringBuffer[DISP_BUFF_LEN * 2];
|
|||
|
TCHAR DisplayStringBuffer[DISP_BUFF_LEN];
|
|||
|
|
|||
|
if (hMod) {
|
|||
|
if ((LoadString(hMod, DP_TEXT_FORMAT, DisplayStringBuffer, DISP_BUFF_LEN)) > 0) {
|
|||
|
for (wID=DP_HELP_TEXT_START; wID <= DP_HELP_TEXT_END; wID++) {
|
|||
|
if ((LoadString(hMod, wID, DisplayStringBuffer, DISP_BUFF_LEN)) > 0) {
|
|||
|
CharToOem (DisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DisplayChangeCmd();
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DisplayStatus (
|
|||
|
LPSTR lpszMachine
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
HKEY hRegistry;
|
|||
|
HKEY hDiskPerfKey;
|
|||
|
DWORD dwValue, dwValueSize, dwTag;
|
|||
|
TCHAR OemDisplayStringBuffer[DISP_BUFF_LEN * 2];
|
|||
|
|
|||
|
TCHAR cMachineName[MAX_MACHINE_NAME_LEN];
|
|||
|
PTCHAR pThisWideChar;
|
|||
|
PCHAR pThisChar;
|
|||
|
INT iCharCount;
|
|||
|
|
|||
|
pThisChar = lpszMachine;
|
|||
|
pThisWideChar = cMachineName;
|
|||
|
iCharCount = 0;
|
|||
|
|
|||
|
if (pThisChar) { // if machine is not NULL, then copy
|
|||
|
while (*pThisChar) {
|
|||
|
*pThisWideChar++ = (TCHAR)(*pThisChar++);
|
|||
|
if (++iCharCount >= MAX_MACHINE_NAME_LEN) break;
|
|||
|
}
|
|||
|
*pThisWideChar = 0;
|
|||
|
}
|
|||
|
|
|||
|
Status = RegConnectRegistry(
|
|||
|
lpszMachine,
|
|||
|
HKEY_LOCAL_MACHINE,
|
|||
|
&hRegistry);
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
// connected to registry on machine
|
|||
|
|
|||
|
Status = RegOpenKeyEx (
|
|||
|
hRegistry,
|
|||
|
lpwszDiskPerfKey,
|
|||
|
(DWORD)0,
|
|||
|
KEY_QUERY_VALUE,
|
|||
|
&hDiskPerfKey);
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
dwValueSize = sizeof(dwValue);
|
|||
|
Status = RegQueryValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
StartKey,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
(LPBYTE)&dwValue,
|
|||
|
&dwValueSize);
|
|||
|
|
|||
|
dwValueSize = sizeof(dwTag);
|
|||
|
Status = RegQueryValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
TagKey,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
(LPBYTE)&dwTag,
|
|||
|
&dwValueSize);
|
|||
|
|
|||
|
if (!lpszMachine) {
|
|||
|
lstrcpy(cMachineName,
|
|||
|
GetStringResource(DP_THIS_SYSTEM));
|
|||
|
}
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource (DP_CURRENT_FORMAT),
|
|||
|
(dwTag == TAG_ENHANCED ?
|
|||
|
GetStringResource(DP_ENHANCED) : EmptyString),
|
|||
|
cMachineName,
|
|||
|
GetStringResource(REG_TO_DP_INDEX(dwValue)));
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
if (dwTag == TAG_ENHANCED) {
|
|||
|
CharToOem (GetStringResource (DP_DISCLAIMER),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
} else {
|
|||
|
CharToOem (GetFormatResource (DP_UNABLE_READ_START),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
|
|||
|
RegCloseKey (hDiskPerfKey);
|
|||
|
} else {
|
|||
|
CharToOem (GetFormatResource (DP_UNABLE_READ_REGISTRY),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (lpszMachine != NULL) {
|
|||
|
lstrcpy (cMachineName,
|
|||
|
GetStringResource(DP_THIS_SYSTEM));
|
|||
|
}
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource(DP_UNABLE_CONNECT), cMachineName);
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (Status != ERROR_SUCCESS) {
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource (DP_STATUS_FORMAT), Status);
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DoChangeCommand (
|
|||
|
LPSTR lpszCommand,
|
|||
|
LPSTR lpszMachine
|
|||
|
)
|
|||
|
{
|
|||
|
// connect to registry on local machine with read/write access
|
|||
|
NTSTATUS Status;
|
|||
|
HKEY hRegistry;
|
|||
|
HKEY hDiskPerfKey;
|
|||
|
DWORD dwValue, dwValueSize, dwOrigValue, dwTag, dwOrigTag;
|
|||
|
|
|||
|
TCHAR cMachineName[MAX_MACHINE_NAME_LEN];
|
|||
|
PTCHAR pThisWideChar;
|
|||
|
PCHAR pThisChar;
|
|||
|
INT iCharCount;
|
|||
|
PCHAR pCmdChar;
|
|||
|
|
|||
|
TCHAR OemDisplayStringBuffer[DISP_BUFF_LEN * 2];
|
|||
|
// check command to see if it's valid
|
|||
|
|
|||
|
_strupr (lpszCommand);
|
|||
|
|
|||
|
pCmdChar = lpszCommand;
|
|||
|
dwValue = 0;
|
|||
|
if (*pCmdChar++ == SWITCH_CHAR ) {
|
|||
|
if (*pCmdChar == ENABLE_CHAR) {
|
|||
|
if (*(pCmdChar+1) == ENHANCED_CHAR) {
|
|||
|
dwValue = SERVICE_BOOT_START;
|
|||
|
dwTag = TAG_ENHANCED;
|
|||
|
} else {
|
|||
|
dwValue = SERVICE_BOOT_START;
|
|||
|
dwTag = TAG_NORMAL;
|
|||
|
}
|
|||
|
} else if (*pCmdChar == DISABLE_CHAR) {
|
|||
|
dwValue = SERVICE_DISABLED;
|
|||
|
dwTag = TAG_NORMAL;
|
|||
|
} else {
|
|||
|
DisplayCmdHelp();
|
|||
|
return ERROR_SUCCESS;
|
|||
|
}
|
|||
|
} else {
|
|||
|
DisplayChangeCmd();
|
|||
|
return ERROR_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
// if command OK then convert machine to wide string for connection
|
|||
|
|
|||
|
pThisChar = lpszMachine;
|
|||
|
pThisWideChar = cMachineName;
|
|||
|
iCharCount = 0;
|
|||
|
|
|||
|
if (pThisChar) {
|
|||
|
while (*pThisChar) {
|
|||
|
*pThisWideChar++ = (TCHAR)(*pThisChar++);
|
|||
|
if (++iCharCount >= MAX_MACHINE_NAME_LEN) break;
|
|||
|
}
|
|||
|
*pThisWideChar = 0; // null terminate
|
|||
|
}
|
|||
|
|
|||
|
// connect to registry
|
|||
|
|
|||
|
Status = RegConnectRegistry(
|
|||
|
lpszMachine,
|
|||
|
HKEY_LOCAL_MACHINE,
|
|||
|
&hRegistry);
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
// connected to registry on machine
|
|||
|
// open key to modify
|
|||
|
|
|||
|
Status = RegOpenKeyEx (
|
|||
|
hRegistry,
|
|||
|
lpwszDiskPerfKey,
|
|||
|
(DWORD)0,
|
|||
|
KEY_WRITE | KEY_READ,
|
|||
|
&hDiskPerfKey);
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
dwValueSize = sizeof(dwValue);
|
|||
|
Status = RegQueryValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
StartKey,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
(LPBYTE)&dwOrigValue,
|
|||
|
&dwValueSize);
|
|||
|
|
|||
|
dwValueSize = sizeof(dwOrigTag);
|
|||
|
Status = RegQueryValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
TagKey,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
(LPBYTE)&dwOrigTag,
|
|||
|
&dwValueSize);
|
|||
|
|
|||
|
if (!lpszMachine) {
|
|||
|
lstrcpy (cMachineName,
|
|||
|
GetStringResource(DP_THIS_SYSTEM));
|
|||
|
}
|
|||
|
|
|||
|
if ((Status == ERROR_SUCCESS) &&
|
|||
|
((dwValue != dwOrigValue) || (dwTag != dwOrigTag))) {
|
|||
|
|
|||
|
Status = RegSetValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
StartKey,
|
|||
|
0L,
|
|||
|
REG_DWORD,
|
|||
|
(LPBYTE)&dwValue,
|
|||
|
sizeof(dwValue));
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
Status = RegSetValueEx (
|
|||
|
hDiskPerfKey,
|
|||
|
TagKey,
|
|||
|
0L,
|
|||
|
REG_DWORD,
|
|||
|
(LPBYTE)&dwTag,
|
|||
|
sizeof(dwTag));
|
|||
|
}
|
|||
|
|
|||
|
if (Status != ERROR_SUCCESS) {
|
|||
|
CharToOem (GetFormatResource(DP_UNABLE_MODIFY_VALUE),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
} else {
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource(DP_NEW_DISKPERF_STATUS),
|
|||
|
(dwTag == TAG_ENHANCED ?
|
|||
|
GetStringResource(DP_ENHANCED) : EmptyString),
|
|||
|
cMachineName,
|
|||
|
GetStringResource(REG_TO_DP_INDEX(dwValue)));
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
|
|||
|
if (dwTag == TAG_ENHANCED) {
|
|||
|
CharToOem (GetStringResource (DP_DISCLAIMER),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
|
|||
|
CharToOem (GetFormatResource(DP_REBOOTED), OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
|
|||
|
} else if (Status != ERROR_SUCCESS) {
|
|||
|
CharToOem (GetFormatResource(DP_UNABLE_READ_REGISTRY),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
} else {
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource(DP_CURRENT_FORMAT),
|
|||
|
(dwTag == TAG_ENHANCED ?
|
|||
|
GetStringResource(DP_ENHANCED) : EmptyString),
|
|||
|
cMachineName,
|
|||
|
GetStringResource(REG_TO_DP_INDEX(dwValue)));
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
|
|||
|
if (dwTag == TAG_ENHANCED) {
|
|||
|
CharToOem (GetStringResource (DP_DISCLAIMER),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
RegCloseKey (hDiskPerfKey);
|
|||
|
} else {
|
|||
|
CharToOem (GetFormatResource(DP_UNABLE_READ_REGISTRY),
|
|||
|
OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (lpszMachine != NULL) {
|
|||
|
lstrcpy (cMachineName,
|
|||
|
GetStringResource(DP_THIS_SYSTEM));
|
|||
|
}
|
|||
|
sprintf (OemDisplayStringBuffer,
|
|||
|
GetFormatResource(DP_UNABLE_CONNECT), cMachineName);
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
if (Status != ERROR_SUCCESS) {
|
|||
|
sprintf (OemDisplayStringBuffer, GetFormatResource(DP_STATUS_FORMAT), Status);
|
|||
|
CharToOem (OemDisplayStringBuffer, OemDisplayStringBuffer);
|
|||
|
printf (OemDisplayStringBuffer);
|
|||
|
}
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
int
|
|||
|
_CRTAPI1 main(
|
|||
|
int argc,
|
|||
|
char *argv[]
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status = ERROR_SUCCESS;
|
|||
|
|
|||
|
hMod = (HINSTANCE)GetModuleHandle(NULL); // get instance ID of this module;
|
|||
|
|
|||
|
// check for command arguments
|
|||
|
|
|||
|
if (argc == CMD_SHOW_LOCAL_STATUS) {
|
|||
|
Status = DisplayStatus(NULL);
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
DisplayChangeCmd();
|
|||
|
}
|
|||
|
} else if (argc >= CMD_DO_COMMAND) {
|
|||
|
if (ArgIsSystem(argv[1])) {
|
|||
|
Status = DisplayStatus (argv[1]);
|
|||
|
if (Status != ERROR_SUCCESS) {
|
|||
|
DisplayChangeCmd();
|
|||
|
}
|
|||
|
} else { // do change command
|
|||
|
if (argc == LOCAL_CHANGE) {
|
|||
|
DoChangeCommand (argv[1], NULL);
|
|||
|
} else if (argc == REMOTE_CHANGE) {
|
|||
|
DoChangeCommand(argv[1], argv[2]);
|
|||
|
} else {
|
|||
|
DisplayChangeCmd();
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
DisplayCmdHelp();
|
|||
|
}
|
|||
|
printf ("\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|