none
枚举USN时参数错误:GetLastError 87 RRS feed

  • 问题

  • // USN2Test.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #pragma warning(disable : 4996) 
    
    #define MAXLENTH 1024
    
    BOOL ifntfs(TCHAR* volname);//用来获取某磁盘是否为NTFS格式,若是,返回True。
    HANDLE GethVol(TCHAR* volname);//获取磁盘句柄。
    BOOL CreatUSN(HANDLE hVol);//创建USN日志并获取基本信息
    
    CREATE_USN_JOURNAL_DATA data;
    USN_JOURNAL_DATA usndata;
    PUSN_RECORD pRec;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE hVol;
    	DWORD udsize=0;
    	DWORD dwRetBytes;
    	usndata.FirstUsn = 0;
    	MFT_ENUM_DATA med ;
    	ifntfs(L"C:");
    	hVol = GethVol(L"C:");
    	TCHAR Buffer[MAXLENTH] = { '\0' };
    	//CHAR Buffer[MAXLENTH];
    	//memset(Buffer, 0, MAXLENTH);
    	if (CreatUSN(hVol))
    	{
    		//std::cout << GetLastError() << '\n';
    		med.StartFileReferenceNumber = 0;
    		med.LowUsn = usndata.FirstUsn;
    		med.HighUsn = usndata.NextUsn;
    		DeviceIoControl(
    			hVol,
    			FSCTL_ENUM_USN_DATA,
    			&med,
    			sizeof(med),
    			Buffer,
    			MAXLENTH,
    			&udsize,
    			NULL
    			);
    		std::cout << udsize << '\n';
    		std::cout << GetLastError() << '\n';
    		
    	}
    	getchar();
    	return 0;
    }
    BOOL ifntfs(TCHAR* volname)
    {
    	TCHAR Buffer[16] = { '\0' };
    	TCHAR Volname[128] = { '\0' };
    	_tcscpy_s(Volname, _countof(Volname), volname);
    	_tcscat_s(Volname,_countof(Volname), L"\\");
    	BOOL result = GetVolumeInformation(
    		Volname, //_In_opt_   LPCTSTR lpRootPathName,此处如果为NULL则默认为当前盘符
    		NULL, // _Out_opt_  LPTSTR lpVolumeNameBuffer,一个指向接收特定驱动器名称的缓冲区。这个缓冲区大小由下一个参数决定。
    		NULL,// _In_       DWORD nVolumeNameSize,上一个参数的的长度。如果上一个参数为NULL这里也是NULL
    		NULL, //_Out_opt_  LPDWORD lpVolumeSerialNumber,一个指向接收驱动器串行码缓冲区的指针。
    		NULL, //_Out_opt_  LPDWORD lpMaximumComponentLength,一个指向接受最大长度变量的指针。
    		NULL, //  _Out_opt_  LPDWORD lpFileSystemFlags,
    		Buffer,// _Out_opt_  LPTSTR lpFileSystemNameBuffer,这个用来接收文件系统的名称如NTFS,FAT32.
    		17//_In_       DWORD nFileSystemNameSize文件系统名称的长度。
    		);
    	if (result)
    	{
    		if (!wcscmp(Buffer, L"NTFS")) return result;
    	}
    	return false;
    }
    HANDLE GethVol(TCHAR* volname)
    {
    	TCHAR Buffer[128] = L"\\\\.\\";
    	_tcscat_s(Buffer, _countof(Buffer), volname);
    	HANDLE hVol = CreateFile(Buffer,// lpFileName [in]
    		GENERIC_READ | GENERIC_WRITE,//dwDesiredAccess [in]
    		FILE_SHARE_READ | FILE_SHARE_WRITE,//dwShareMode [in]
    		NULL, //lpSecurityAttributes [in, optional]
    		OPEN_EXISTING, //dwCreationDisposition [in]
    		FILE_ATTRIBUTE_READONLY, //dwFlagsAndAttributes [in]
    		NULL//hTemplateFile [in, optional]
    		);
    	return hVol;
    }
    BOOL CreatUSN(HANDLE hVol)
    {
    	DWORD dw;
    	BOOL ifsuccess = DeviceIoControl(hVol,
    		FSCTL_CREATE_USN_JOURNAL,
    		&data,
    		sizeof(data),
    		NULL,
    		0,
    		&dw,
    		NULL
    		);
    	if (ifsuccess)
    	{
    		ifsuccess = DeviceIoControl(hVol,
    			FSCTL_QUERY_USN_JOURNAL,
    			NULL,
    			0,
    			&usndata,
    			sizeof(usndata),
    			&dw,
    			NULL
    			);
    		//std::cout << GetLastError() << '\n';
    	}
    	return ifsuccess;
    }

    哎呀。。最近真是。。总来麻烦大家。。。这个是枚举USN。。。在最后一步的时候用GetLastError返回87.。可是没发现参数错误啊。。。其它函数都很正常。。。GetLastError均为0.。求解。。。(测试的时候需要管理员权限)。。。

    Visual Basic 初学者 望关照!

    2014年3月8日 15:10

答案

全部回复