2016-07-22 66 views
0

下面是我的C++代碼,我嘗試備份一個文件,包括安全信息。我使用備份讀取,但每當代碼被稱爲EXE崩潰。Exec崩潰在BackupRead Windows功能

char buff[225280]; 
DWORD numberOfBytesToRead = 225280; 
DWORD dwBytesRead=0, dwBytesWritten, dwBytesRead2=0; 
BOOL bProcessSecurity = TRUE; 
LPWSTR sourceBackupFile = L"E:\\myFolder\\backup.txt"; 
HANDLE source = CreateFile(sourceBackupFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
// Check for errors 
if (source == INVALID_HANDLE_VALUE) { 
cout<<"The Handle is Invalid:"<<GetLastError()<<endl; 
} 
else 
{ 
    cout<< "\n The source file is in E:\\myFolder\\backup.txt" <<endl ; 
} 
LPDWORD numberofbytedsreadinreadFile = 0; 

cout << "Point Of Crash" << endl; 
if (!BackupRead(
     source, 
     &buff, 
     numberOfBytesToRead, 
     numberofbytedsreadinreadFile, 
     FALSE, 
     TRUE, 
     NULL 
     )) 
    { 

     cout << "Backup Read Failed with the error::" << GetLastError() << endl ; 

    } 

它崩潰

The source file is in E:\\myFolder\\backup.txt 
"Point of Crash" 
+0

崩潰之前它打印什麼?無效的句柄或有效的源文件?你不應該試圖用無效的句柄做任何事情。 – Dutow

+0

它在沒有其他任何事情發生之前打印「碰撞點」。我只是試圖打開手柄,我沒有用它做任何事情。那之後我關閉了手柄。我想它不是一個問題,因爲它在此之前破解 – mano

+0

該句柄用作BackupRead的參數。根據您的源代碼,您的程序應該在崩潰之前打印一個cout。 – Dutow

回答

1

您通過NULL作爲最後一個參數來BackupRead,這顯然是無效acording到docs前打印本。

lpContext [out]指向接收的指針所使用的BackupRead保持在備份操作期間上下文 信息的 內部數據結構的一個變量。在第一次調用指定文件或目錄的BackupRead 之前,必須將由lpContext指向的變量 設置爲NULL。該函數爲 分配內存的數據結構,然後將變量設置爲指向該結構的 。您不得更改lpContext或其在調用BackupRead之間指向的變量。要釋放 數據結構使用的內存,請在備份操作完成時調用BackupRead,並將bAbort參數設置爲 TRUE。

你應該傳遞一個指向它的指針,它指向null,而不是null值。 (LPVOIDvoid*LPVOID**裝置void**

器同上numberofbytedsreadinreadFile:你應該傳遞參數到現有的變量,而不是一個空指針,它是一個輸出參數。

void* backupContext = NULL; 
int numberOfBytesRead = 0; 
cout << "Point Of Crash" << endl; 
if (!BackupRead(
       source, 
       &buff, 
       numberOfBytesToRead, 
       &numberOfBytesRead, 
       FALSE, 
       TRUE, 
       &backupContext 
       )) 

如果你得到一個無效的句柄而不是繼續,你也應該從這個方法返回。

+0

我已經設置了void * backupContext = NULL;你提到的它仍然在崩潰。 – mano

+0

這意味着你的其他參數仍然是錯誤的。例如'source',正如我在評論中所問。 – Dutow

+0

句柄是有效的,因爲我沒有得到任何錯誤。 – mano