WriteFile正在将文件名写入文件
WriteFile writing filename to file
我遇到了一个非常奇怪的问题。
我正在连接Xbox 360上的Winsock功能,发送。这个函数在我试图从中转储HttpRequest信息的应用程序中被调用了很多。
首先,我将展示代码并解释我的问题:
WritetoFile函数。
BOOL WritetoFile(char* filename, char* buffer, DWORD len)
{
// Setup expansion
doMountPath("Hdd:", "\Device\Harddisk0\Partition1");
//print
printf("Creating %sn", filename);
//create our file
HANDLE fileHandle = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
//does file exist?
if(fileHandle!=INVALID_HANDLE_VALUE)
{
//print
printf("Writing to file... n");
//bytes written parameter
DWORD wfbr;
//write to our file
if(WriteFile(fileHandle, (void*)&buffer, len, &wfbr, NULL))
{
printf("File written! (Bytes Written:%u) n", wfbr);
} else {
printf("Error writing to file: (Error:%u)n", GetLastError());
}
//close our file handle
CloseHandle(fileHandle);
} else {
printf("Error creating file: (Error:%u)n", GetLastError());
}
return true;
}
Winsock挂钩
INT WINSOCK_SEND_HOOK(SOCKET s,const char FAR *buf,int len,int flags)
{
memcpy(SocketData.SendData, buf, len);
if(len>40)
{
WINSOCK_SEND_COUNT +=1;
char Filename[40];
sprintf(Filename, "Hdd:\Dump\Send\Winsock_Send_%d.txt", WINSOCK_SEND_COUNT);
WritetoFile(Filename, SocketData.SendData, len);
} else { printf("Winsock skippedn"); }
memset(SocketData.SendData, 0, 0x1388);
return send(s, buf, len, flags);
}
这个问题很难解释。因此,当我第一次运行.dll来挂接这个函数时,它一直运行良好,直到尝试创建"Winsock_Send_85.txt"
`Creating b0ZEK0EwSDBwSXR2RW5EdXd5ZXFnN1IrLzFQYno4RmN0ZnI2MnNnWWQwb2JXMGlYbEdQRkxGOXFkdHJabiszb1I2MG1vUFlkSjBJVW0xcFB4UzZxWEtqZEVYSjEvQmJtOHhmMUdVMDlZaHA2SUtWZTJjb0ZVU1RsUTlvYXJhc0NDOHJNUitlUDBaQmVSOTNUWVM1TU1hLzB0NlhGZmQ2dE1CVDRKVTRxdzliRUtlRmVvVGgvaVdoMUFBczBpNzhkcXNlVUYwaTlQT3B5ekdyeU9ZTzU0QWYyVXpUSXZiTDMzRWl4SXhzOUJOZDZxaWtDQUlNQmZkNHRYVTNaS2pKZngxRmd3dXE2QnRIYmkySlgxcE9vUjFyVlRpci9iZHdTZTZEOTJDSXFqNkNqM0lSaDY1N3VKUzhOQ3VxaFZpclhTUnZMZlJCN21mTS9aV2dCRUJNWHBVeUdZcGxqOVNGUÿÿexception code=0xc0000005 thread=0xf9000044 address=0x910d0a00 read=0x910d0a00 firstxbWatson: Xbox is restarting`
然后崩溃。重新启动控制台后,我再次运行它,它运行良好,不会崩溃,但它现在正在将不正确的数据写入文件,这些文件都是相同的重复数据,即使缓冲区指向不同的数据。这是它写入文件的内容:
‘ÀÛ( W
ÿÿÿÿÿÿÿÿ ÿÿÿÿ‘Á Hdd:DumpSendWinsock_Send_87.txt ‚i夀…Ü H>
然后我发现了一种阻止这种情况发生的方法,那就是完全切断控制台的电源,但后来又回到了第一个问题。
请忽略您可能认为不必要的memcpy使用。
问题很快就解决了(令人尴尬),我不敢相信我为此挣扎了1个小时,这是一个愚蠢的错误。
我没有检查缓冲区的大小,因此没有分配足够的内存。
相关文章:
- 不带预处理器的调用方法/文件的文件名/行号
- 如何在目录及其子文件夹中构建文件名字符串向量?
- VSCode C++调试文件名中包含中文字符的文件时插件损坏
- 生成文件文件名参数
- 如何让我的代码显示文件名不正确或文件中数字的平均值?
- 如何更改目录中文件夹中的文件名
- 从 C++ 中的文件路径中提取文件名
- 从 QFileSystemModel 中的文件路径和文件名获取 QModelIndex
- 如何更改变量文件名的文件路径?
- 有没有办法打印包含当前文件的文件的文件名
- CMake 意外地将最后一个文件名预置到可执行文件中
- Qt - 如何在 30 天后删除日志文件,文件名不固定
- 将文件重命名为已存在的文件名
- 如何在 Windows 上从 C++11 统计信息对象的文件序列号中查找文件名
- Xcode 8.3.2 中的错误警告:文件的非可移植路径 - 指定的路径与磁盘上的文件名不同
- 如何在C 中读取具有前缀和时间戳为文件名的文件
- 使用文件名作为字符串从任意souce .cpp文件中调用函数
- 预处理器指令:为什么使用#Define的标题文件标识符与标头文件名不同
- 如何通过键入文件名来获取文件的目录。(C++)
- 如何根据用户输入指定的文件名打开文件