📄 deveject.cpp
字号:
Result = deec_ErrorGettingDevNodeStatus;
*NativeErrorCode = r;
}
if (Result == deec_Ok)
{
ULONG DeviceIDLen;
r = Func_GetDeviceIDSize(&DeviceIDLen,ThisDevInst,0);
if (r != CR_SUCCESS)
{
Result = deec_ErrorGettingDeviceIdSize;
*NativeErrorCode = r;
}
else
{
PCHAR DeviceID = new CHAR[DeviceIDLen + 1];
if (DeviceID)
{
r = Func_GetDeviceID(ThisDevInst,DeviceID,DeviceIDLen + 1,0);
if (r != CR_SUCCESS)
{
Result = deec_ErrorGettingDeviceId;
*NativeErrorCode = r;
}
else
{
CHAR FriendlyName[512];
if (!GetFriendlyName(DeviceID,FriendlyName,sizeof FriendlyName))
FriendlyName[0] = '\0';
if (Verbose)
{
for (int i = 0;i < Indent * 2;++i)
printf(" ");
printf("%s",DeviceID);
if (Debug)
{
printf(" DevInst: %u",ThisDevInst);
printf(" Status: 0x%X ",Status);
}
if (FriendlyName[0])
printf(" '%s'",FriendlyName);
if (Status & DN_REMOVABLE)
printf(" [REMOVEABLE]");
if (ProblemNumber)
printf(" ProblemNumber: %u",ProblemNumber);
printf("\n");
}
else
{
if (!EjectDevSpec || !EjectDevSpec[0])
if (Status & DN_REMOVABLE)
{
if (FriendlyName[0])
printf("'%s' ",FriendlyName);
printf("'%s' [REMOVEABLE]\n",DeviceID);
}
}
BOOL Found = FALSE;
if (EjectDevSpec && EjectDevSpec[0])
{
if (EjectDevSpecIsName)
{
if (FriendlyName[0])
Found = CompareWithWildcard(FriendlyName,EjectDevSpec);
}
else
Found = CompareWithWildcard(DeviceID,EjectDevSpec);
}
if (Found)
{
++*EjectDeviceFound;
DEVINST EjectDevInst = ThisDevInst;
if (!(Status & DN_REMOVABLE))
{
// Dieses Device ist nicht auswerfbar, probiere 黚ergeordneten Eintrag
for (PEnumDeviceInfo EDI = ParentEnumDeviceInfo;EDI;EDI = EDI->Parent)
{
if (EDI->Status & DN_REMOVABLE)
{
EjectDevInst = EDI->DevInst;
Status = EDI->Status;
ProblemNumber = EDI->ProblemNumber;
break;
}
}
}
if (!(Status & DN_REMOVABLE))
{
Result = deec_DeviceNotRemovable;
printf("Device");
if (FriendlyName[0])
printf(" '%s'",FriendlyName);
printf(" [%s] not removable!\n",DeviceID);
}
else
{
if (ProblemNumber)
{
Result = deec_DeviceHasProblem;
*NativeErrorCode = ProblemNumber;
}
else
{
printf("Ejecting ");
if (FriendlyName[0])
printf(" '%s'",FriendlyName);
printf(" [%s]...",DeviceID);
PNP_VETO_TYPE VetoType;
CHAR VetoName[MAX_PATH];
r = Func_RequestDeviceEject(EjectDevInst,&VetoType,VetoName,sizeof VetoName,0);
if (r == CR_SUCCESS)
printf("ok.\n");
else
{
printf("FAILED (%u,%u)\n",r,VetoType);
if (r == CR_REMOVE_VETOED)
{
Result = deec_ErrorEjectVetoed;
*NativeErrorCode = VetoType;
}
else
{
Result = deec_ErrorDeviceEject;
*NativeErrorCode = r;
}
}
}
}
}
}
delete [] DeviceID;
}
}
}
if (Result == deec_Ok)
{
DEVINST Child;
r = Func_GetChild(&Child,ThisDevInst,0);
if (r == CR_NO_SUCH_DEVNODE)
{
}
else if (r != CR_SUCCESS)
{
Result = deec_ErrorGettingChild;
*NativeErrorCode = r;
}
else
{
TEnumDeviceInfo EnumDeviceInfo;
EnumDeviceInfo.Parent = ParentEnumDeviceInfo;
EnumDeviceInfo.DevInst = ThisDevInst;
EnumDeviceInfo.Status = Status;
EnumDeviceInfo.ProblemNumber = ProblemNumber;
Result = EnumDevices(&EnumDeviceInfo,EjectDeviceFound,EjectDevSpec,EjectDevSpecIsName,Child,Indent + 1,NativeErrorCode);
}
if (Result == deec_Ok)
{
DEVINST Sibling;
r = Func_GetSibling(&Sibling,ThisDevInst,0);
if (r == CR_NO_SUCH_DEVNODE)
break;
if (r != CR_SUCCESS)
{
Result = deec_ErrorGettingSibling;
*NativeErrorCode = r;
}
ThisDevInst = Sibling;
}
}
}
return Result;
}
TDeviceEject::TDeviceEjectErrorCode TDeviceEject::Eject(PCHAR EjectDevSpec,BOOL EjectDevSpecIsName,PDWORD NativeErrorCode,PDWORD EjectedCount)
{
TDeviceEjectErrorCode Result = deec_Ok;
*NativeErrorCode = 0;
if (EjectedCount)
*EjectedCount = 0;
if (!Func_LocateDevNode || !Func_GetChild || !Func_GetSibling || !Func_GetDevNodeStatus || !Func_GetDeviceIDSize || !Func_GetDeviceID || !Func_RequestDeviceEject)
Result = deec_LibraryFunctionMissing;
else
{
DEVINST RootDevInst;
CONFIGRET r = Func_LocateDevNode(&RootDevInst,NULL,0/*CM_LOCATE_DEVNODE_NORMAL*/);
if (r != CR_SUCCESS)
{
Result = deec_ErrorLocatingDevNode;
*NativeErrorCode = r;
}
else
{
DWORD EjectDeviceFound = 0;
Result = EnumDevices(NULL,&EjectDeviceFound,EjectDevSpec,EjectDevSpecIsName,RootDevInst,0,NativeErrorCode);
if ((Result == deec_Ok) && EjectDevSpec[0] && !EjectDeviceFound)
Result = deec_DeviceNotFound;
if (EjectedCount)
*EjectedCount = EjectDeviceFound;
}
}
return Result;
}
int main(int argc,char *argv[])
{
int ExitCode = 0;
printf("DevEject 1.0 2003 c't/Matthias Withopf\n\n");
BOOL ArgsOk = TRUE;
BOOL Verbose = FALSE;
BOOL Debug = FALSE;
CHAR EjectDrive[80];
CHAR EjectDevSpec[1024];
EjectDrive[0] = '\0';
EjectDevSpec[0] = '\0';
BOOL EjectDevSpecIsName = FALSE;
for (int i = 1;i < argc;++i)
{
if (!strcmp(argv[i],"-v"))
Verbose = TRUE;
else if (!strcmp(argv[i],"-Debug"))
Debug = TRUE;
else if (!strncmp(argv[i],"-EjectDrive:",12))
{
strncpy(EjectDrive,argv[i] + 12,sizeof EjectDrive - 1);
EjectDrive[sizeof EjectDrive - 1] = '\0';
if (!TDeviceEject::GetDriveDeviceId(EjectDrive,EjectDevSpec,sizeof EjectDevSpec))
{
printf("Invalid drive specification '%s'!\n",EjectDrive);
ArgsOk = FALSE;
break;
}
EjectDevSpecIsName = FALSE;
}
else if (!strncmp(argv[i],"-EjectName:",11))
{
strncpy(EjectDevSpec,argv[i] + 11,sizeof EjectDevSpec - 1);
EjectDevSpec[sizeof EjectDevSpec - 1] = '\0';
EjectDevSpecIsName = TRUE;
}
else if (!strncmp(argv[i],"-EjectId:",9))
{
strncpy(EjectDevSpec,argv[i] + 9,sizeof EjectDevSpec - 1);
EjectDevSpec[sizeof EjectDevSpec - 1] = '\0';
EjectDevSpecIsName = FALSE;
}
else
{
printf("Unknown argument '%s'!\n",argv[i]);
ArgsOk = FALSE;
break;
}
}
if (!ArgsOk)
{
ExitCode = 10;
printf("Usage: %s -EjectDrive:<Drive>|-EjectName:<Name>|-EjectId:<DeviceId> [-v] [-Debug]\n",argv[0]);
}
else
{
if (Verbose)
{
if (EjectDrive[0])
printf("Ejecting: %s -> %s\n",EjectDrive,EjectDevSpec);
else if (EjectDevSpec[0])
printf("Ejecting: %s\n",EjectDevSpec);
}
PDeviceEject DeviceEject = new TDeviceEject(Verbose,Debug);
if (!DeviceEject)
ExitCode = 11;
else
{
if (DeviceEject->DeviceEjectErrorCode)
{
ExitCode = 12;
switch(DeviceEject->DeviceEjectErrorCode)
{
case TDeviceEject::deec_UnsupportedOS:
printf("Operating system not supported!\n");
break;
default:
printf("Error in device eject, error code %u,%u!\n",DeviceEject->DeviceEjectErrorCode,DeviceEject->NativeErrorCode);
break;
}
}
else
{
DWORD NativeErrorCode;
DWORD EjectedCount;
TDeviceEject::TDeviceEjectErrorCode ErrorCode = DeviceEject->Eject(EjectDevSpec,EjectDevSpecIsName,&NativeErrorCode,&EjectedCount);
if (ErrorCode == TDeviceEject::deec_Ok)
{
if (EjectDevSpec[0])
printf("%u device(s) ejected.\n",EjectedCount);
}
else
{
ExitCode = 13;
switch(ErrorCode)
{
case TDeviceEject::deec_DeviceNotFound:
printf("Error ejecting device %s, not found (%u,%u)!\n",EjectDevSpec,ErrorCode,NativeErrorCode);
break;
case TDeviceEject::deec_DeviceNotRemovable:
printf("Error ejecting device %s, not removable (%u,%u)!\n",EjectDevSpec,ErrorCode,NativeErrorCode);
break;
case TDeviceEject::deec_DeviceHasProblem:
printf("Error ejecting device %s, has problem (%u,%u)!\n",EjectDevSpec,ErrorCode,NativeErrorCode);
break;
case TDeviceEject::deec_ErrorEjectVetoed:
printf("Error ejecting device %s, vetoed (%u,%u)!\n",EjectDevSpec,ErrorCode,NativeErrorCode);
break;
default:
printf("Error ejecting device %s, error code %u,%u!\n",EjectDevSpec,ErrorCode,NativeErrorCode);
break;
}
}
}
delete DeviceEject;
}
}
return ExitCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -