Пытаюсь сделать такое Код (Text): NTSTATUS MyMoveFileEx(LPCTSTR lpOldFileName,LPCTSTR lpNewFileName) { NTSTATUS stat; WCHAR oldDisk[4]=L""; WCHAR newDisk[4]=L""; wcsncpy(oldDisk,lpOldFileName,2); wcsncpy(newDisk,lpNewFileName,2); if(wcscmp(oldDisk,newDisk)==0) { HANDLE outFile=NULL; OBJECT_ATTRIBUTES attr={0}; IO_STATUS_BLOCK res={0}; UNICODE_STRING oldfilename={0}; UNICODE_STRING newfilename={0}; RtlDosPathNameToNtPathName_U (lpOldFileName,&oldfilename,NULL,NULL); RtlDosPathNameToNtPathName_U (lpNewFileName,&newfilename,NULL,NULL); oldfilename.Length = (USHORT)(sizeof(WCHAR)* wcslen (oldfilename.Buffer)); oldfilename.MaximumLength = 512; InitializeObjectAttributes (&attr, &oldfilename, 0, 0, 0); stat = ZwCreateFile (&outFile, GENERIC_ALL, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL,FILE_SHARE_VALID_FLAGS, FILE_OPEN, 0, 0, 0); if(stat==STATUS_SUCCESS) { FILE_RENAME_INFORMATION fri={0}; fri.ReplaceIfEx=1; wcscpy (fri.FileName,newfilename.Buffer); fri.FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)); stat=ZwSetInformationFile(outFile,&res,&fri,sizeof(FILE_RENAME_INFORMATION),FileRenameInformation); //вот тут вылетает статус stat = -1073741811 } } else { } return stat; } Что я не так делаю...? делаю просто MyMoveFileEx(L"c:\\123.txt",L"c:\\321.txt");
Под FILE_RENAME_INFORMATION нужно буффер вообще-то выделять с учетом длины имени, т.к. в объявлении typedef struct _FILE_RENAME_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; ULONG FileNameLength; WCHAR FileName[1]; } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; FileName имеет размер 1, странно, что у тебя вообще с бсодом все не падает =)
Velheart Спасибо..Скажите плиз,какой должен быть размер выделяемый -sizeof(FILE_RENAME_INFORMATION)+FileNameLength или я че-то не пойму.. Не поймите превратно-первый раз с такими вещами сталкиваюсь
Код (Text): PFILE_RENAME_INFORMATION fri=(PFILE_RENAME_INFORMATION)RtlAllocateHeap( Heap, 0, sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)) ); wcscpy (fri->FileName,newfilename.Buffer); fri->ReplaceIfEx=1; fri->RootDirectory=NULL; fri->FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)); stat=ZwSetInformationFile(outFile,&res,fri,sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)),FileRenameInformation); делал и так Код (Text): PFILE_RENAME_INFORMATION fri=(PFILE_RENAME_INFORMATION)RtlAllocateHeap( Heap, 0, sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)+ sizeof(L'\0')) ); wcscpy (fri->FileName,newfilename.Buffer); fri->ReplaceIfEx=1; fri->RootDirectory=NULL; fri->FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)); stat=ZwSetInformationFile(outFile,&res,fri,sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)+ sizeof(L'\0')),FileRenameInformation); выдает ошибку stat = -1073741757 я даже незнаю. что это Мож поможет кто Просто переименовать файл
Страно,но новый путь не должен содержать имени диска, т.е с:\\333.txt должен быть как 333.txt А есть функции для распарсивания в ntdll ?
Статус -- STATUS_SHARING_VIOLATION, значит где-то наверно остался открытый хэндл на твой файл, попробуй закрывать его после переименовывания, это вообще всегда нужно делать =), а полный или нет путь -- не имеет значения, если все в пределах одного каталога..
Velheart Ну вообще ошибка возникает ВО ВРЕМЯ выполнения переименовывания.Я лишь открываю старый файл,что б хендл получить. хм.. нехнаю.. Но если передать в параметр лишь путь файла без имени диска файла-тогда работает.. О_о
coocky Хех, так это наверно не драйвер? =), я просто сразу внимание на название темы не обратил, я имел ввиду если ты в дрове откроешь файл, то хэндл автоматически не закроется, и возможны конфликты разделения с предыдущими запусками при тестировании, а про полный путь -- по чем взял, по тому и продаю: DDK
Velheart вообщем что получается если делать делаю просто MyMoveFileEx(L"c:\\123.txt",L"c:\\321.txt"); то параметр FILE_RENAME_INFORMATION::FileName должен выглядеть,как 321.txt Если MyMoveFileEx(L"c:\\123.txt",L"c:\\MyFolder\\321.txt"); то параметр FILE_RENAME_INFORMATION::FileName должен выглядеть,как "c:\\MyFolder\\321.txt" ничего не понимаю... Если параметр RootDirectory равен нулю И файл перемещается в другую директорию,то должен быть полный путь,иначе только имя файла... Что ж так все сложно.. Скажите плиз-какой функцией ntdll можно распарсить путь, что б сравнить директории? Спасибо..