?? setup.cpp
字號:
ShowError(MB_OK|MB_ICONWARNING, err, "portParameters.Load(%s)", phPortName);
}
char buf[100];
portParameters.FillParametersStr(buf, sizeof(buf)/sizeof(buf[0]));
Trace(" %s %s\n", phPortName, buf);
}
if (!InstallBusDevice(infFile, i))
goto err;
return 0;
err:
Trace("\nInstall not completed!\n");
return 1;
}
///////////////////////////////////////////////////////////////
int Uninstall(InfFile &infFile)
{
BOOL rebootRequired = FALSE;
DevProperties devProperties;
devProperties = DevProperties();
devProperties.pDevId = C0C_PORT_DEVICE_ID;
if (!DisableDevices(infFile, &devProperties, &rebootRequired))
return 1;
devProperties = DevProperties();
devProperties.pDevId = C0C_BUS_DEVICE_ID;
if (!RemoveDevices(infFile, &devProperties, &rebootRequired))
return 1;
if (!RemoveDevices(infFile, NULL, NULL))
return 1;
if (rebootRequired) {
SetupPromptReboot(NULL, NULL, FALSE);
return 0;
}
int res;
BOOL notDeleted;
LONG err;
do {
notDeleted = TRUE;
res = IDCONTINUE;
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM) {
do {
res = IDCONTINUE;
SC_HANDLE hSrv = OpenService(hSCM, C0C_SERVICE, DELETE|SERVICE_QUERY_STATUS);
if (hSrv) {
SERVICE_STATUS srvStatus;
if (QueryServiceStatus(hSrv, &srvStatus)) {
if (srvStatus.dwCurrentState == SERVICE_STOPPED) {
if (ShowMsg(MB_YESNO,
"The deleting %s service will remove your manual settings.\n"
"Would you like to delete service?\n",
C0C_SERVICE) == IDYES)
{
if (DeleteService(hSrv)) {
Trace("Deleted Service %s\n", C0C_SERVICE);
notDeleted = FALSE;
} else {
res = ShowLastError(MB_CANCELTRYCONTINUE, "DeleteService(%s)", C0C_SERVICE);
}
}
} else {
res = ShowMsg(MB_CANCELTRYCONTINUE,
"Service %s is not stopped (state %ld).",
C0C_SERVICE, (long)srvStatus.dwCurrentState);
}
} else {
res = ShowLastError(MB_CANCELTRYCONTINUE, "QueryServiceStatus(%s)", C0C_SERVICE);
}
if (!CloseServiceHandle(hSrv))
ShowLastError(MB_OK|MB_ICONWARNING, "CloseServiceHandle(hSrv)");
} else {
if (GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) {
Trace("Service %s not installed\n", C0C_SERVICE);
notDeleted = FALSE;
} else {
res = ShowLastError(MB_CANCELTRYCONTINUE, "OpenService(%s)", C0C_SERVICE);
}
}
} while (res == IDTRYAGAIN);
if (!CloseServiceHandle(hSCM))
ShowLastError(MB_OK|MB_ICONWARNING, "CloseServiceHandle(hSCM)");
} else {
res = ShowLastError(MB_CANCELTRYCONTINUE, "OpenSCManager()");
}
} while (res == IDTRYAGAIN);
if (notDeleted)
Trace("WARNING: Service %s not deleted\n", C0C_SERVICE);
if (res != IDCONTINUE)
return 1;
do {
notDeleted = TRUE;
res = IDCONTINUE;
err = RegDeleteKey(HKEY_LOCAL_MACHINE, C0C_REGKEY_EVENTLOG);
if (err == ERROR_SUCCESS) {
Trace("Deleted EventLog %s\n", C0C_SERVICE);
notDeleted = FALSE;
}
else
if (err == ERROR_FILE_NOT_FOUND) {
Trace("EventLog %s not installed\n", C0C_SERVICE);
notDeleted = FALSE;
}
else {
res = ShowError(MB_CANCELTRYCONTINUE, err, "RegDeleteKey(%s)", C0C_REGKEY_EVENTLOG);
}
} while (res == IDTRYAGAIN);
if (notDeleted)
Trace("WARNING: Key %s not deleted\n", C0C_REGKEY_EVENTLOG);
if (res != IDCONTINUE)
return 1;
do {
notDeleted = TRUE;
res = IDCONTINUE;
HKEY hKey = SetupDiOpenClassRegKey(NULL, DELETE);
if (hKey != INVALID_HANDLE_VALUE) {
do {
res = IDCONTINUE;
err = RegDeleteKey(hKey, infFile.ClassGUID());
if (err != ERROR_SUCCESS) {
HKEY hClassGuidKey;
err = RegOpenKeyEx(hKey, infFile.ClassGUID(), 0, KEY_READ, &hClassGuidKey);
if (err == ERROR_SUCCESS) {
for (;;) {
char subKey[MAX_PATH+1];
DWORD subKeySize = sizeof(subKey)/sizeof(subKey[0]);
err = RegEnumKeyEx(hClassGuidKey, 0, subKey, &subKeySize, NULL, NULL, NULL, NULL);
if (err != ERROR_SUCCESS)
break;
err = RegDeleteKey(hClassGuidKey, subKey);
if (err == ERROR_SUCCESS)
Trace("Deleted Class subkey %s\\%s\n", infFile.ClassGUID(), subKey);
else
if (err != ERROR_FILE_NOT_FOUND) {
ShowError(MB_OK|MB_ICONWARNING, err, "RegDeleteKey(%s\\%s)", infFile.ClassGUID(), subKey);
break;
}
}
err = RegCloseKey(hClassGuidKey);
if (err != ERROR_SUCCESS)
ShowError(MB_OK|MB_ICONWARNING, err, "RegCloseKey()");
}
err = RegDeleteKey(hKey, infFile.ClassGUID());
}
if (err == ERROR_SUCCESS) {
Trace("Deleted Class %s\n", infFile.ClassGUID());
notDeleted = FALSE;
}
else
if (err == ERROR_FILE_NOT_FOUND) {
Trace("Class %s not installed\n", infFile.ClassGUID());
notDeleted = FALSE;
}
else {
res = ShowError(MB_CANCELTRYCONTINUE, err, "RegDeleteKey(%s)", infFile.ClassGUID());
}
} while (res == IDTRYAGAIN);
err = RegCloseKey(hKey);
if (err != ERROR_SUCCESS)
ShowError(MB_OK|MB_ICONWARNING, err, "RegCloseKey()");
} else {
res = ShowLastError(MB_CANCELTRYCONTINUE, "SetupDiOpenClassRegKey(NULL)");
}
} while (res == IDTRYAGAIN);
if (notDeleted)
Trace("WARNING: Class %s not deleted\n", infFile.ClassGUID());
if (res != IDCONTINUE)
return 1;
if (!infFile.UninstallOEMInf())
return 1;
if (!infFile.UninstallFiles(C0C_COPY_DRIVERS_SECTION))
return 1;
if (!InfFile::UninstallAllInfFiles(C0C_CLASS_GUID, NULL, NULL))
return 1;
return 0;
}
///////////////////////////////////////////////////////////////
int Help(const char *pCmdPref)
{
SetTitle(C0C_SETUP_TITLE " (HELP)");
ConsoleWrite(
C0C_SETUP_TITLE "\n"
"\n");
ConsoleWrite(
"Usage:\n"
" %s [options] <command>\n"
, pCmdPref);
ConsoleWrite(
"\n"
"Options:\n"
" --output <file> - file for output, default is console\n"
);
ConsoleWrite(
"\n"
"Commands:\n"
" install <n> <prmsA> <prmsB> - install a pair of linked ports with\n"
" or identifiers " C0C_PREF_PORT_NAME_A "<n> and "
C0C_PREF_PORT_NAME_B "<n>\n"
" install <prmsA> <prmsB> (by default <n> is the first not used number),\n"
" set their parameters to <prmsA> and <prmsB>\n"
" remove <n> - remove a pair of linked ports with\n"
" identifiers " C0C_PREF_PORT_NAME_A "<n> and "
C0C_PREF_PORT_NAME_B "<n>\n"
" change <portid> <prms> - set parameters <prms> for port with\n"
" identifier <portid>\n"
" list - for each port show its identifier and\n"
" parameters\n"
" preinstall - preinstall driver\n"
" update - update driver\n"
" uninstall - uninstall all ports and the driver\n"
" quit - quit\n"
" help - print this help\n"
);
ConsoleWrite(
"\n"
"%s",
PortParameters::GetHelp());
ConsoleWrite(
"\n"
"Examples:\n"
);
ConsoleWrite(
" %sinstall - -\n"
, pCmdPref);
ConsoleWrite(
" %sinstall 5 * *\n"
, pCmdPref);
ConsoleWrite(
" %sremove 0\n"
, pCmdPref);
ConsoleWrite(
" %sinstall PortName=COM2 PortName=COM4\n"
, pCmdPref);
ConsoleWrite(
" %sinstall PortName=COM5,EmuBR=yes,EmuOverrun=yes -\n"
, pCmdPref);
ConsoleWrite(
" %schange " C0C_PREF_PORT_NAME_A "0 EmuBR=yes,EmuOverrun=yes\n"
, pCmdPref);
ConsoleWrite(
" %slist\n"
, pCmdPref);
ConsoleWrite(
" %suninstall\n"
, pCmdPref);
ConsoleWrite(
"\n");
return 1;
}
///////////////////////////////////////////////////////////////
int Main(int argc, const char* argv[])
{
SetOutputFile(NULL);
while (argc > 1) {
if (*argv[1] != '-')
break;
if (!strcmp(argv[1], "--output") && argc > 2) {
SetOutputFile(argv[2]);
argv[2] = argv[0];
argv += 2;
argc -= 2;
} else {
ConsoleWrite("Invalid option %s\n", argv[1]);
return 1;
}
}
if (argc == 1) {
return 0;
}
else
if (argc == 2 && !lstrcmpi(argv[1], "help")) {
Help(argv[0]);
return 0;
}
else
if (argc == 2 && !lstrcmpi(argv[1], "quit")) {
return 0;
}
InfFile infFile(C0C_INF_NAME, C0C_INF_NAME);
if (!infFile.Compare(C0C_CLASS_GUID, C0C_CLASS, C0C_PROVIDER))
return 1;
if (argc == 2 && !lstrcmpi(argv[1], "list")) {
SetTitle(C0C_SETUP_TITLE " (LIST)");
return Change(infFile, NULL, NULL);
}
else
if (argc == 4 && !lstrcmpi(argv[1], "change")) {
SetTitle(C0C_SETUP_TITLE " (CHANGE)");
return Change(infFile, argv[2], argv[3]);
}
else
if (argc == 4 && !lstrcmpi(argv[1], "install")) {
SetTitle(C0C_SETUP_TITLE " (INSTALL)");
return Install(infFile, argv[2], argv[3], -1);
}
else
if (argc == 5 && !lstrcmpi(argv[1], "install")) {
SetTitle(C0C_SETUP_TITLE " (INSTALL)");
int num;
if (StrToInt(argv[2], &num) && num >= 0)
return Install(infFile, argv[3], argv[4], num);
}
else
if (argc == 3 && !lstrcmpi(argv[1], "remove")) {
SetTitle(C0C_SETUP_TITLE " (REMOVE)");
int num;
if (StrToInt(argv[2], &num) && num >= 0)
return Remove(infFile, num);
}
else
if (argc == 2 && !lstrcmpi(argv[1], "preinstall")) {
SetTitle(C0C_SETUP_TITLE " (PREINSTALL)");
return Preinstall(infFile);
}
else
if (argc == 2 && !lstrcmpi(argv[1], "update")) {
SetTitle(C0C_SETUP_TITLE " (UPDATE)");
return Update(infFile);
}
else
if (argc == 2 && !lstrcmpi(argv[1], "uninstall")) {
SetTitle(C0C_SETUP_TITLE " (UNINSTALL)");
return Uninstall(infFile);
}
ConsoleWrite("Invalid command\n");
return 1;
}
///////////////////////////////////////////////////////////////
static int ParseCmd(char *pCmd, const char* argv[], int sizeArgv)
{
int argc;
argc = 0;
for (char *pArg = strtok(pCmd, " \t\r\n") ; pArg ; pArg = strtok(NULL, " \t\r\n")) {
if ((argc + 2) > sizeArgv)
break;
if (*pArg == '"')
pArg++;
char *pEnd = pArg + lstrlen(pArg);
if (pEnd-- != pArg && *pEnd == '"')
*pEnd = 0;
argv[argc++] = pArg;
}
argv[argc] = NULL;
return argc;
}
///////////////////////////////////////////////////////////////
int CALLBACK RunDllA(HWND /*hWnd*/, HINSTANCE /*hInst*/, LPSTR pCmdLine, int /*nCmdShow*/)
{
SetTitle(C0C_SETUP_TITLE);
char cmd[200];
lstrcpyn(cmd, pCmdLine, sizeof(cmd)/sizeof(cmd[0]));
int argc;
const char* argv[10];
argc = ParseCmd(cmd, argv + 1, sizeof(argv)/sizeof(argv[0]) - 1) + 1;
if (argc == 1) {
ConsoleWrite("Enter 'help' to get info about usage of " C0C_SETUP_TITLE ".\n\n");
argv[0] = "";
for (;;) {
argv[1] = NULL;
ConsoleWriteRead(cmd, sizeof(cmd)/sizeof(cmd[0]), "command> ");
argc = ParseCmd(cmd, argv + 1, sizeof(argv)/sizeof(argv[0]) - 1) + 1;
if (argc == 2 && !lstrcmpi(argv[1], "quit"))
return 0;
Main(argc, argv);
}
}
argv[0] = "rundll32 setup,RunDll ";
int res = Main(argc, argv);
if (!GetOutputFile())
ConsoleWriteRead(cmd, sizeof(cmd)/sizeof(cmd[0]), "\nPress <RETURN> to continue\n");
return res;
}
///////////////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -