Делаю следующим образом:
// opening the target file for write
InitializeObjectAttributes( &objAttributes, &fileName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL, NULL);
status = ZwOpenFile(&targetFileHandle, GENERIC_WRITE | GENERIC_READ | SYNCHRONIZE, &objAttributes,
&ioStatus, FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
...
PFILE_RENAME_INFORMATION renameInfo = NULL;
....
renameInfo->ReplaceIfExists = TRUE;
renameInfo->RootDirectory = NULL;
renameInfo->FileNameLength = ...
RtlCopyMemory( &renameInfo->FileName[0], // только новое имя ('newname.ext')
destFileNamePtr,
renameInfo->FileNameLength);
status = ZwSetInformationFile( targetFileHandle, &ioStatus,
renameInfo, renameInfoLength, FileRenameInformation);
когда таким образом переименовывается файл на локальном диске (что-нить типа C:\file.ext) — все работает ok.
Но если переименованный файл лежит на сетевой шаре (\??\UNC\Computer\share\file.ext) ZwSetInformationFile виснет намертво.
Есть какие-то ньюансы с переименованием такого файла?