NTFS 변경 저널을 읽으려고하지만 Windows 7에서 작동하는 경우에도 찾을 수있는 모든 예제 코드가 Windows 7에서도 작동한다는 것을 알고 있습니다.Windows 10에서 NTFS 변경 저널 걷기
예를 들어 Microsoft에서 만든예제는 Windows 7에서 작동하지만 Windows 10에서 동일한 코드를 실행하면 FSCTL_READ_USN_JOURNAL을 사용하여 DeviceIoControl을 호출 할 때 오류 (이 매개 변수는 올바르지 않습니다.)가 발생합니다 (FSCTL_QUERY_USN_JOURNAL을 사용하여 DeviceIoControl에 대한 이전 호출이 완료됨에 유의하십시오. 성공적으로 유효한 데이터를 반환합니다.).
EXE를 컴파일하고 Windows 7에서 작업하고 Windows 10 컴퓨터로 복사 했는데도 여전히 실패하므로 Windows 10이 매개 변수 유효성 검사 또는 그와 비슷한 것일 수 있습니다.
관리자로 코드를 실행 중이므로 문제가되지 않습니다.
나는이 문제에 대한 다른 참조를 찾을 수 없습니다,하지만 난 다른 사람에게 예제 코드를 수강하면이 같은 문제를 얻을
편집 윈도우 10에서 실행하려고 :
코드 자체 :
#include <Windows.h>
#include <WinIoCtl.h>
#include <stdio.h>
#define BUF_LEN 4096
void main()
{
HANDLE hVol;
CHAR Buffer[BUF_LEN];
USN_JOURNAL_DATA JournalData;
READ_USN_JOURNAL_DATA ReadData = {0, 0xFFFFFFFF, FALSE, 0, 0};
PUSN_RECORD UsnRecord;
DWORD dwBytes;
DWORD dwRetBytes;
int I;
hVol = CreateFile(TEXT("\\\\.\\c:"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hVol == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed (%d)\n", GetLastError());
return;
}
if(!DeviceIoControl(hVol,
FSCTL_QUERY_USN_JOURNAL,
NULL,
0,
&JournalData,
sizeof(JournalData),
&dwBytes,
NULL))
{
printf("Query journal failed (%d)\n", GetLastError());
return;
}
ReadData.UsnJournalID = JournalData.UsnJournalID;
printf("Journal ID: %I64x\n", JournalData.UsnJournalID);
printf("FirstUsn: %I64x\n\n", JournalData.FirstUsn);
for(I=0; I<=10; I++)
{
memset(Buffer, 0, BUF_LEN);
if(!DeviceIoControl(hVol,
FSCTL_READ_USN_JOURNAL,
&ReadData,
sizeof(ReadData),
&Buffer,
BUF_LEN,
&dwBytes,
NULL))
{
printf("Read journal failed (%d)\n", GetLastError());
return;
}
dwRetBytes = dwBytes - sizeof(USN);
// Find the first record
UsnRecord = (PUSN_RECORD)(((PUCHAR)Buffer) + sizeof(USN));
printf("****************************************\n");
// This loop could go on for a long time, given the current buffer size.
while(dwRetBytes > 0)
{
printf("USN: %I64x\n", UsnRecord->Usn);
printf("File name: %.*S\n",
UsnRecord->FileNameLength/2,
UsnRecord->FileName);
printf("Reason: %x\n", UsnRecord->Reason);
printf("\n");
dwRetBytes -= UsnRecord->RecordLength;
// Find the next record
UsnRecord = (PUSN_RECORD)(((PCHAR)UsnRecord) +
UsnRecord->RecordLength);
}
// Update starting USN for next call
ReadData.StartUsn = *(USN *)&Buffer;
}
CloseHandle(hVol);
}
[mcve]를 입력하십시오. – IInspectable
@IInspectable, https://msdn.microsoft.com/en-us/library/windows/desktop/aa365736(v=vs.85).aspx에 제공된 링크에는 최소한의 완전하고 검증 가능한 예제가 포함되어 있습니다. 여기서 코드를 복사하여 복사 할 수 있는지 확신 할 수 없지만 가능한 간단한 예제는 없습니다. – BenS1
질문 [**]에 [mcve] **를 게시 할 수 없다면 문제가 주제와 관련이 없습니다. – IInspectable