426 lines
13 KiB
C++
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
|