windows-nt/Source/XPSP1/NT/shell/tools/drvfull/drvfull.cpp
2020-09-26 16:20:57 +08:00

426 lines
13 KiB
C++

#include "drvfull.h"
#include <tchar.h>
#include <stdio.h>
#include <windows.h>
//#include <winnetp.h>
#include "dfioctl.h"
#include "dfuser.h"
#include "dfpnp.h"
#include "dfcm.h"
#include "dfstpdi.h"
#include "dfhlprs.h"
#define CCHINDENT 2
#define CCHINDENT2 (CCHINDENT * 2)
#define CCHINDENT3 (CCHINDENT * 3)
#define CCHINDENT4 (CCHINDENT * 4)
#define FIRST_ARG 1
#define SECOND_ARG 2
#define THIRD_ARG 3
#define FOURTH_ARG 4
#define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0]))
struct _sFlag
{
LPTSTR pszFlag;
DWORD dwFlag;
DWORD dwArg;
};
static _sFlag _flagTable[] =
{
{ TEXT("-hg"), IOCTL_GEOMETRY, FIRST_ARG},
{ TEXT("-hl"), IOCTL_LAYOUT, FIRST_ARG},
{ TEXT("-hp"), IOCTL_PARTITION, FIRST_ARG},
{ TEXT("-hpsure"), IOCTL_PARTITIONSURE, FIRST_ARG},
{ TEXT("-hpgpt"), IOCTL_PARTITIONGPT, FIRST_ARG},
{ TEXT("-vn"), IOCTL_VOLUMENUMBER, FIRST_ARG},
{ TEXT("-ma"), IOCTL_MEDIAACCESSIBLE, FIRST_ARG},
{ TEXT("-mw"), IOCTL_DISKISWRITABLE, FIRST_ARG},
{ TEXT("-mt"), IOCTL_MEDIATYPES, FIRST_ARG},
{ TEXT("-mt2"), IOCTL_MEDIATYPES2, FIRST_ARG},
{ TEXT("-mx"), IOCTL_MEDIATYPESEX, FIRST_ARG},
{ TEXT("-mdvd"), IOCTL_DVD, FIRST_ARG},
{ TEXT("-ej"), IOCTL_EJECT, FIRST_ARG},
{ TEXT("-dar"), IOCTL_MCNCONTROL, FIRST_ARG},
{ TEXT("-grp"), IOCTL_GETREPARSEPOINT, FIRST_ARG},
{ TEXT("-gcmmc2"), IOCTL_CDROMGETCONFIGMMC2, FIRST_ARG},
{ TEXT("-gcdvdram"), IOCTL_CDROMGETCONFIGDVDRAM, FIRST_ARG},
{ TEXT("-gcrw"), IOCTL_CDROMGETCONFIGRW, FIRST_ARG},
{ TEXT("-gcwo"), IOCTL_CDROMGETCONFIGWO, FIRST_ARG},
{ TEXT("-gcisw"), IOCTL_CDROMGETCONFIGISW, FIRST_ARG},
{ TEXT("-gcall"), IOCTL_CDROMGETCONFIGALL, FIRST_ARG},
{ TEXT("-pnpe"), PNP_CMENUM, SECOND_ARG},
{ TEXT("-pnps"), PNP_WATCHSETUPDI, SECOND_ARG},
{ TEXT("-pnpc"), PNP_WATCHCM, SECOND_ARG},
{ TEXT("-pnpd"), PNP_CMDEVICE, SECOND_ARG},
{ TEXT("-pnpi"), PNP_CMINTERFACE, SECOND_ARG},
{ TEXT("-pnph"), PNP_HANDLE, SECOND_ARG},
{ TEXT("-pnpeb"), PNP_EJECTBUTTON, SECOND_ARG},
{ TEXT("-pnpl"), PNP_CMDEVICEIDLIST, SECOND_ARG},
{ TEXT("-pnpcs"), PNP_CUSTOMPROPERTY, SECOND_ARG},
{ TEXT("-ugdt"), USER_GETDRIVETYPE, THIRD_ARG},
{ TEXT("-ugvi"), USER_GETVOLUMEINFORMATION, THIRD_ARG},
{ TEXT("-ugfa"), USER_GETFILEATTRIBUTES, THIRD_ARG},
{ TEXT("-uqdd"), USER_QUERYDOSDEVICE, THIRD_ARG},
{ TEXT("-uqddn"), USER_QUERYDOSDEVICENULL, THIRD_ARG},
{ TEXT("-ugld"), USER_GETLOGICALDRIVES, THIRD_ARG},
{ TEXT("-uwneterc"), USER_WNETENUMRESOURCECONNECTED, THIRD_ARG},
{ TEXT("-uwneterr"), USER_WNETENUMRESOURCEREMEMBERED, THIRD_ARG},
{ TEXT("-ntma"), NT_MEDIAPRESENT, THIRD_ARG},
{ TEXT("-Z"), MOD_FULLREPORTFULL, FOURTH_ARG},
{ TEXT("-Z1"), MOD_FULLREPORT1, FOURTH_ARG},
{ TEXT("-Z2"), MOD_FULLREPORT2, FOURTH_ARG},
{ TEXT("-Z3"), MOD_FULLREPORT3, FOURTH_ARG},
};
void _SetFlag(_sFlag* psflag, DWORD dwFlags[])
{
dwFlags[psflag->dwArg - 1] |= psflag->dwFlag;
}
BOOL _IsFlagSet(DWORD dwFlag, DWORD dwFlags[])
{
BOOL fRet = FALSE;
for (DWORD dw = 0; dw < ARRAYSIZE(_flagTable); ++dw)
{
if (dwFlag == _flagTable[dw].dwFlag)
{
if ((dwFlags[_flagTable[dw].dwArg - 1] & OPER_MASK) & dwFlag)
{
fRet = TRUE;
}
break;
}
}
return fRet;
}
BOOL _IsCategorySet(DWORD dwFlag, DWORD dwFlags[])
{
BOOL fRet = FALSE;
for (DWORD dw = 0; dw < ARRAYSIZE(_flagTable); ++dw)
{
if (dwFlag == (_flagTable[dw].dwFlag & CAT_MASK))
{
if ((dwFlags[_flagTable[dw].dwArg - 1] & CAT_MASK) & dwFlag)
{
fRet = TRUE;
}
break;
}
}
return fRet;
}
HRESULT _ExtractFlags(int argc, wchar_t* argv[], DWORD dwFlags[])
{
HRESULT hres = E_FAIL;
// for now
for (int i = 0; i < argc; ++i)
{
for (DWORD dw = 0; dw < ARRAYSIZE(_flagTable); ++dw)
{
if (!lstrcmp(_flagTable[dw].pszFlag, argv[i]))
{
_SetFlag(&(_flagTable[dw]), dwFlags);
hres = S_OK;
break;
}
}
}
return hres;
}
HRESULT _Dispatch(DWORD dwFlags[], LPTSTR pszArg)
{
HRESULT hres = S_OK;
if (_IsCategorySet(IOCTL_FLAGS, dwFlags))
{
hres = _ProcessIOCTL(dwFlags, pszArg, CCHINDENT);
}
else
{
if (_IsCategorySet(PNP_FLAGS, dwFlags))
{
// for now
if (_IsFlagSet(PNP_WATCHCM, dwFlags))
{
hres = _FullTree(dwFlags, 4);
}
else
{
// for now
/* if (_IsFlagSet(PNP_HAL, dwFlags))
{
hres = _HALGetPCIBusData(dwFlags, 4);
}
else
{*/
// for now
if (_IsFlagSet(PNP_CMDEVICE, dwFlags))
{
hres = _DeviceInfo(dwFlags, pszArg, 4);
}
else
{
if (_IsFlagSet(PNP_CMINTERFACE, dwFlags))
{
hres = _DeviceInterface(dwFlags, pszArg, 4);
}
else
{
if (_IsFlagSet(PNP_CMENUM, dwFlags))
{
hres = _EnumDevice(dwFlags, pszArg, 4);
}
else
{
if (_IsFlagSet(PNP_CMDEVICEIDLIST, dwFlags))
{
hres = _DeviceIDList(dwFlags, pszArg, 4);
}
else
{
if (_IsFlagSet(PNP_CUSTOMPROPERTY, dwFlags))
{
hres = _CustomProperty(dwFlags, pszArg, 4);
}
else
{
hres = _ProcessPNP(dwFlags, pszArg, CCHINDENT);
}
}
}
}
}
// }
}
}
else
{
if (_IsCategorySet(USER_FLAGS, dwFlags))
{
hres = _ProcessUser(dwFlags, pszArg, CCHINDENT);
}
else
{
hres = E_INVALIDARG;
}
}
}
return hres;
}
HRESULT _Help()
{
HRESULT hres = S_OK;
wprintf(TEXT("Some title\n\n"));
_PrintIndent(CCHINDENT);
wprintf(TEXT("Flags:\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-h* (Hard drive)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-hg drive Geometry (1)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-hl drive Layout (1)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-hp partition drive (one partition) (1)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-hpgpt is partition GPT? (guid partition table) (2)\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-m* (Media)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ma is Media Accessible? (2)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-mt Media Type (using IOCTL_STORAGE_GET_MEDIA_TYPES) (2)(3)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-mt2 Media Type (using IOCTL_DISK_GET_MEDIA_TYPES) (2)(3)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-mw is Media Write-Protected? (2)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-mx Media Type Ex (2)(4)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-mdvd DVD drive? (2)(4)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-grp Get Reparse Point Guid (6)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gc* (CDROM Get Configuration)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcmmc2 is MMC2 compliant? (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcall all MMC2 features implemented. (5)\n"));
/* _PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcdvdram is DVD-RAM drive? (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcrw is random writable? (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcwo is write once (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-gcisw is incremental streaming writable (5)\n"));*/
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-v* (Volume)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-vn Volume Number? (2)\n"));
/* _PrintIndent(CCHINDENT2);
wprintf(TEXT("-e* (Eject)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ej EJect media (2)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-el Load Media (2)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ed Disable hardware button (2)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ee Enable hardware button (2)\n"));*/
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-pnp* Plug 'n' Play\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnps Handle using SetupDI* API\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpc Handle using CM_* API\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpd Dump device info using CM_* API\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpi Dump device interface info using CM_* API\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnph Watch HANDLE event on Volume (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpeb Monitor Eject button (5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpe Enum device implementing the interface (7)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpl Enum device ID list\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-pnpcs PnP device CustomProperties\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-u* User functions\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ugdt GetDriveType ()\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ugvi GetVolumeInformation (2)(5)\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ugfa GetFileAttributes\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-uqdd QueryDosDevice ()\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-uqddn QueryDosDevice with NULL for first param\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ugld GetLogicalDrives\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-uwneterc WNetEnumResource Connected\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-uwneterr WNetEnumResource Remembered\n"));
_PrintIndent(CCHINDENT4);
wprintf(TEXT("-ntma NtQueryVolumeInformationFile (TBD)\n"));
/* _PrintCR();
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-? This message.\n"));*/
_PrintCR();
_PrintIndent(CCHINDENT);
wprintf(TEXT("Modifiers:\n"));
/* _PrintIndent(CCHINDENT2);
wprintf(TEXT("-F Force\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-R Raw function call\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-T Elapsed time\n"));*/
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-Z Full report - as much as possible\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-Z1 Full report - level 1\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-Z2 Full report - level 2\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("-Z3 Full report - level 3\n"));
_PrintCR();
_PrintIndent(CCHINDENT);
wprintf(TEXT("Notes:\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(1) Requires '\\\\.\\PhysicalDriveX' arg, where X is 0-n\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(2) Requires '\\\\.\\c:' arg or '\\\\?\\Volume{GUID}' (both without trailing '\\')\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(3) Floppy only\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(4) Non-Floppy only\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(5) Requires '\\\\?\\Volume{GUID}' (without trailing '\\')\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(6) Requires a junction point pathname\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(7) An interface GUID, e.g. '{4D36E967-E325-11CE-BFC1-08002BE10318}'\n"));
_PrintIndent(CCHINDENT2);
wprintf(TEXT("(8) A DOS device name, e.g. 'c:'\n"));
return hres;
}
int g_argc = 0;
wchar_t** g_argv = NULL;
#ifdef UNICODE
extern "C"
{
int __cdecl wmain(int argc, wchar_t* argv[])
#else
int __cdecl main(int argc, char* argv[])
#endif
{
HRESULT hres = S_OK;
if (argc > 1)
{
DWORD dwFlags[MAX_FLAGS] = {0};
g_argv = argv;
g_argc = argc;
hres = _ExtractFlags(argc, argv, dwFlags);
if (SUCCEEDED(hres))
{
hres = _Dispatch(dwFlags, argv[argc - 1]);
}
}
else
{
hres = _Help();
}
return hres;
}
#ifdef UNICODE
}
#endif