2016-07-22 42 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