помогите переименовать файл функцией NativeApi

Тема в разделе "WASM.BEGINNERS", создана пользователем coocky, 20 авг 2008.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Пытаюсь сделать такое

    Код (Text):
    1. NTSTATUS MyMoveFileEx(LPCTSTR lpOldFileName,LPCTSTR lpNewFileName)
    2.  
    3. {
    4.  
    5. NTSTATUS stat;
    6. WCHAR oldDisk[4]=L"";
    7. WCHAR newDisk[4]=L"";
    8. wcsncpy(oldDisk,lpOldFileName,2);
    9. wcsncpy(newDisk,lpNewFileName,2);
    10. if(wcscmp(oldDisk,newDisk)==0)
    11.  
    12. {
    13.     HANDLE outFile=NULL;
    14.  
    15.     OBJECT_ATTRIBUTES attr={0};
    16.     IO_STATUS_BLOCK res={0};
    17.     UNICODE_STRING oldfilename={0};
    18.     UNICODE_STRING newfilename={0};
    19.  
    20.     RtlDosPathNameToNtPathName_U (lpOldFileName,&oldfilename,NULL,NULL);
    21.     RtlDosPathNameToNtPathName_U (lpNewFileName,&newfilename,NULL,NULL);
    22.  
    23.     oldfilename.Length =  (USHORT)(sizeof(WCHAR)* wcslen (oldfilename.Buffer));
    24.     oldfilename.MaximumLength = 512;
    25.  
    26.     InitializeObjectAttributes (&attr, &oldfilename, 0, 0, 0);
    27.  
    28.     stat = ZwCreateFile (&outFile, GENERIC_ALL, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL,FILE_SHARE_VALID_FLAGS, FILE_OPEN, 0, 0, 0);
    29.  
    30.     if(stat==STATUS_SUCCESS)
    31.     {
    32.  
    33.         FILE_RENAME_INFORMATION fri={0};
    34.         fri.ReplaceIfEx=1;
    35.         wcscpy (fri.FileName,newfilename.Buffer);
    36.         fri.FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer));
    37.         stat=ZwSetInformationFile(outFile,&res,&fri,sizeof(FILE_RENAME_INFORMATION),FileRenameInformation);
    38.              
    39.               //вот тут вылетает статус stat = -1073741811
    40.     }
    41. }
    42. else
    43. {
    44.  
    45. }
    46.     return stat;
    47. }
    Что я не так делаю...?
    делаю просто MyMoveFileEx(L"c:\\123.txt",L"c:\\321.txt");
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Под 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, странно, что у тебя вообще с бсодом все не падает =)
     
  3. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Velheart

    Спасибо..Скажите плиз,какой должен быть размер выделяемый -sizeof(FILE_RENAME_INFORMATION)+FileNameLength или я че-то не пойму..
    Не поймите превратно-первый раз с такими вещами сталкиваюсь :)
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Ага -- sizeof(FILE_RENAME_INFORMATION)+FileNameLength, лучше на "ты", если не напрягает )
     
  5. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Код (Text):
    1.         PFILE_RENAME_INFORMATION fri=(PFILE_RENAME_INFORMATION)RtlAllocateHeap( Heap, 0, sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)) );
    2.         wcscpy (fri->FileName,newfilename.Buffer);
    3.         fri->ReplaceIfEx=1;
    4.         fri->RootDirectory=NULL;
    5.         fri->FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer));
    6.         stat=ZwSetInformationFile(outFile,&res,fri,sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)),FileRenameInformation);
    делал и так

    Код (Text):
    1.         PFILE_RENAME_INFORMATION fri=(PFILE_RENAME_INFORMATION)RtlAllocateHeap( Heap, 0, sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)+ sizeof(L'\0')) );
    2.         wcscpy (fri->FileName,newfilename.Buffer);
    3.         fri->ReplaceIfEx=1;
    4.         fri->RootDirectory=NULL;
    5.         fri->FileNameLeigth=(USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer));
    6.         stat=ZwSetInformationFile(outFile,&res,fri,sizeof(FILE_RENAME_INFORMATION) + (USHORT)(sizeof(WCHAR)* wcslen (newfilename.Buffer)+ sizeof(L'\0')),FileRenameInformation);
    выдает ошибку stat = -1073741757

    я даже незнаю. что это :)
    Мож поможет кто :)
    Просто переименовать файл
     
  6. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Страно,но новый путь не должен содержать имени диска, т.е с:\\333.txt должен быть как 333.txt
    А есть функции для распарсивания в ntdll ?
     
  7. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Статус -- STATUS_SHARING_VIOLATION, значит где-то наверно остался открытый хэндл на твой файл, попробуй закрывать его после переименовывания, это вообще всегда нужно делать =), а полный или нет путь -- не имеет значения, если все в пределах одного каталога..
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    coocky
    выдает ошибку stat = -1073741757
    0xC0000043, STATUS_SHARING_VIOLATION (ntstatus.h)?
     
  9. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Velheart
    Ну вообще ошибка возникает ВО ВРЕМЯ выполнения переименовывания.Я лишь открываю старый файл,что б хендл получить. :)
    хм.. нехнаю.. Но если передать в параметр лишь путь файла без имени диска файла-тогда работает.. О_о
     
  10. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    coocky
    Хех, так это наверно не драйвер? =), я просто сразу внимание на название темы не обратил, я имел ввиду если ты в дрове откроешь файл, то хэндл автоматически не закроется, и возможны конфликты разделения с предыдущими запусками при тестировании, а про полный путь -- по чем взял, по тому и продаю:
    DDK
     
  11. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    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 можно распарсить путь, что б сравнить директории? Спасибо..
     
  12. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    native Приложение. просто функции только ntdll выполняется до винлогона. :)