我正在使用Windows 7和Microsoft Visual Studio 2010。
我有将内存缓冲区转储到文件的代码。这是:
//
// DumpMemoryToFileW()
// дампим память в файл (Unicode-версия)
// lpFileName - имя файла
// lpData - блок памяти
// dataSize - размер блока
//
BOOL DumpMemoryToFileW( LPWSTR lpFileName, LPVOID lpData, SIZE_T dataSize )
{
HANDLE hFile = NULL;
DWORD dwWritten = 0;
// откроем файл
hFile = CreateFileW(lpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
// отладочное сообщение
DebugPrint(DEBUG_ERROR, "Could not open file; lpFileName = %ws\n", lpFileName);
// выходим с ошибкой
return FALSE;
}
// запишем код
if(!WriteFile(hFile, lpData, (DWORD)dataSize, &dwWritten, NULL))
{
// отладочное сообщение
DebugPrint(DEBUG_ERROR, "Could not write to file; hFile = 0x%p; lpFileName = %ws\n", hFile, lpFileName);
// закрываем хэндл
CloseHandle(hFile);
// выходим с ошибкой
return FALSE;
}
CloseHandle(hFile);
return TRUE;
}
我需要将一些数据保存到临时文件中;所以我使用GetTempPath()
和GetTempFileName()
创建文件名,然后调用DumpMemoryToFileW()
:
// получим временную директорию
GetTempPathW(sizeof(wTempPath) / sizeof(WCHAR), wTempPath);
// сгенерируем имя EXE-файла
GetTempFileNameW(wTempPath, L"", 0, wFilename);
// запишем имя файла
if(!DumpBlockToFileW(wFilename, lpData))
{
// отладочное сообщение
DebugPrint(DEBUG_ERROR, "Could not write to file; exiting with error.\n");
// освободим память
FREE_MEMORY_BLOCK(&Data);
// выходим с ошибкой
return FALSE;
}
DumpBlockToFileW()
是一个使用我的MEMORY_BLOCK
结构(缓冲区和大小)的宏;它扩展到DumpMemoryToFileW()
。但DumpMemoryToFileW()
失败,错误是ERROR_ACCESS_DENIED
- 所以,它无法写入临时文件!文件已创建(我可以在零大小的目录中看到它),但CreateFile()
失败。
有什么问题?
UPDATE:这是调试输出:
[484] [INFO] <script.cpp:723 PID:484 TID:1988 ERR:6> SaveAndUpdate(): File downloaded; Data.Length = 73728
[484] [INFO] <script.cpp:736 PID:484 TID:1988 ERR:0> SaveAndUpdate(): Temp file name for writing: C:\Users\TESTW7~1\AppData\Local\Temp\9E53.tmp
[484] [ERROR] <memory.cpp:123 PID:484 TID:1988 ERR:5> DumpMemoryToFileW(): Could not open file; lpFileName = C:\Users\TESTW7~1\AppData\Local\Temp\9E53.tmp
[484] [ERROR] <script.cpp:742 PID:484 TID:1988 ERR:5> SaveAndUpdate(): Could not write to file; exiting with error.
这是DebugPrint()
的代码:
#ifdef _DEBUG
#define DebugPrint(info, x, ...) ExtendedDebugPrint((info), (x), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#else
#define DebugPrint
#endif // _DEBUG
EXTERNC VOID __cdecl ExtendedDebugPrint( DWORD dwInfoLevel, LPSTR lpszFormat, LPSTR lpszFile, DWORD dwLine, LPSTR lpszFunc, ... )
{
va_list args;
CHAR szString[4200] = { 0 };
LPSTR lpszInfoLevel = NULL;
// получим аргументы
va_start(args, lpszFunc);
// получим имя самого файла
if(strrchr(lpszFile, '\\'))
lpszFile = strrchr(lpszFile, '\\') + 1;
// отформатируем строку
wsprintf(szString, "[%s] <%s:%d PID:%d TID:%d ERR:%d> %s(): ",
infoLevels[dwInfoLevel], lpszFile, dwLine, GetCurrentProcessId(), GetCurrentThreadId(), GetLastError(), lpszFunc);
// напечатаем в строку
wvsprintf(&(szString[strlen(szString)]), lpszFormat, args);
// выведем в дебаг
OutputDebugString(szString);
// закончим работу с аргументами
va_end(args);
}
UPDATE2: Windows 7 32位。