在写入Temp目录中的文件时,CreateFile()失败并且GetLastError()返回ERROR_ACCESS_DENIED

时间:2015-07-02 21:11:13

标签: windows winapi access-denied createfile

我正在使用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位。

0 个答案:

没有答案