Поиск файлов используя Nt-функции...

Тема в разделе "WASM.WIN32", создана пользователем glukker, 22 фев 2008.

  1. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Пытаюсь переписать одну из функций по поиску файлов в текущей директории на поиск по всему диску... Так вот, DDK этот код компилит без ошибок, однако при запуске программа падает (((
    А VS 2003 .NET отказывается линковать говорит:
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function __expandlocale
    find fatal error LNK1120: 1 unresolved externals
    Библиотеки подключил или вообще не поэтому поводу ругается. Помогите разобраться, пожалуйста...
    Искал через поиск NtQueryDirectoryFile одни перехваты, цель написать прогу которая искала на всём диске.
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. //#pragma comment (lib, "ntdll.lib")
    5.  
    6. typedef struct _UNICODE_STRING {
    7.     USHORT Length;
    8.     USHORT MaximumLength;
    9. #ifdef MIDL_PASS
    10.     [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
    11. #else
    12.     PWSTR  Buffer;
    13. #endif
    14. } UNICODE_STRING;
    15.  
    16. typedef UNICODE_STRING *PUNICODE_STRING;
    17. typedef const UNICODE_STRING *PCUNICODE_STRING;
    18. typedef USHORT RTL_STRING_LENGTH_TYPE;
    19.  
    20. typedef struct _STRING {
    21.     USHORT Length;
    22.     USHORT MaximumLength;
    23. #ifdef MIDL_PASS
    24.     [size_is(MaximumLength), length_is(Length) ]
    25. #endif
    26.     PCHAR Buffer;
    27. } STRING;
    28.  
    29. #define FILE_SUPERSEDE                  0x00000000
    30. #define FILE_OPEN                       0x00000001
    31. #define FILE_CREATE                     0x00000002
    32. #define FILE_OPEN_IF                    0x00000003
    33. #define FILE_OVERWRITE                  0x00000004
    34. #define FILE_OVERWRITE_IF               0x00000005
    35. #define FILE_MAXIMUM_DISPOSITION        0x00000005
    36. #define FILE_DIRECTORY_FILE             0x00000001
    37. #define FILE_WRITE_THROUGH              0x00000002
    38. #define FILE_SEQUENTIAL_ONLY            0x00000004
    39. #define FILE_NO_INTERMEDIATE_BUFFERING  0x00000008
    40. #define OBJ_CASE_INSENSITIVE 0x00000040L
    41. #define NTSYSAPI DECLSPEC_IMPORT
    42. #define NTAPI __stdcall
    43. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
    44. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
    45. #define OBJ_INHERIT             0x00000002L
    46. #define OBJ_PERMANENT           0x00000010L
    47. #define OBJ_EXCLUSIVE           0x00000020L
    48. #define OBJ_CASE_INSENSITIVE    0x00000040L
    49. #define OBJ_OPENIF              0x00000080L
    50. #define OBJ_OPENLINK            0x00000100L
    51. #define OBJ_KERNEL_HANDLE       0x00000200L
    52. #define OBJ_FORCE_ACCESS_CHECK  0x00000400L
    53. #define OBJ_VALID_ATTRIBUTES    0x000007F2L
    54.  
    55. typedef DWORD ULONG_PTR;
    56. typedef LONG NTSTATUS;
    57. typedef NTSTATUS *PNTSTATUS;
    58. typedef STRING *PSTRING;
    59. typedef STRING ANSI_STRING;
    60. typedef PSTRING PANSI_STRING;
    61. typedef STRING OEM_STRING;
    62. typedef PSTRING POEM_STRING;
    63. typedef CONST STRING* PCOEM_STRING;
    64.  
    65. typedef enum _EVENT_TYPE {NotificationEvent, SynchronizationEvent} EVENT_TYPE;
    66.  
    67.  
    68. typedef struct _OBJECT_ATTRIBUTES {
    69.     ULONG Length;
    70.     HANDLE RootDirectory;
    71.     PUNICODE_STRING ObjectName;
    72.     ULONG Attributes;
    73.     PVOID SecurityDescriptor;        
    74.     PVOID SecurityQualityOfService;  
    75. } OBJECT_ATTRIBUTES;
    76.  
    77. typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
    78.  
    79. typedef struct _IO_STATUS_BLOCK {
    80.     union {
    81.         NTSTATUS Status;
    82.         PVOID Pointer;
    83.     };
    84.     ULONG_PTR Information;
    85. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
    86.  
    87. typedef struct _OBJDIR_INFORMATION {
    88. UNICODE_STRING ObjectName;
    89. UNICODE_STRING ObjectTypeName;
    90. BYTE Data[1];
    91. } OBJDIR_INFORMATION;
    92.  
    93. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    94. (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \
    95. (p)->RootDirectory = r; \
    96. (p)->Attributes = a; \
    97. (p)->ObjectName = n; \
    98. (p)->SecurityDescriptor = s; \
    99. (p)->SecurityQualityOfService = NULL; \
    100. }
    101. typedef VOID (NTAPI *PIO_APC_ROUTINE) (IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved);
    102.  
    103. typedef enum _FILE_INFORMATION_CLASS {
    104.     FileDirectoryInformation         = 1,
    105.     FileFullDirectoryInformation,  
    106.     FileBothDirectoryInformation,  
    107.     FileBasicInformation,          
    108.     FileStandardInformation,        
    109.     FileInternalInformation,        
    110.     FileEaInformation,              
    111.     FileAccessInformation,          
    112.     FileNameInformation,            
    113.     FileRenameInformation,          
    114.     FileLinkInformation,            
    115.     FileNamesInformation,          
    116.     FileDispositionInformation,    
    117.     FilePositionInformation,      
    118.     FileFullEaInformation,        
    119.     FileModeInformation,            
    120.     FileAlignmentInformation,      
    121.     FileAllInformation,            
    122.     FileAllocationInformation,    
    123.     FileEndOfFileInformation,      
    124.     FileAlternateNameInformation,  
    125.     FileStreamInformation,          
    126.     FilePipeInformation,          
    127.     FilePipeLocalInformation,      
    128.     FilePipeRemoteInformation,    
    129.     FileMailslotQueryInformation,  
    130.     FileMailslotSetInformation,    
    131.     FileCompressionInformation,    
    132.     FileObjectIdInformation,        
    133.     FileCompletionInformation,      
    134.     FileMoveClusterInformation,    
    135.     FileQuotaInformation,          
    136.     FileReparsePointInformation,  
    137.     FileNetworkOpenInformation,    
    138.     FileAttributeTagInformation,  
    139.     FileTrackingInformation,        
    140.     FileIdBothDirectoryInformation,
    141.     FileIdFullDirectoryInformation,
    142.     FileValidDataLengthInformation,
    143.     FileShortNameInformation,      
    144.     FileMaximumInformation
    145. } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
    146.  
    147. typedef struct _FILE_BOTH_DIR_INFORMATION {
    148. ULONG NextEntryOffset;
    149. ULONG FileIndex;
    150. LARGE_INTEGER CreationTime;
    151. LARGE_INTEGER LastAccessTime;
    152. LARGE_INTEGER LastWriteTime;
    153. LARGE_INTEGER ChangeTime;
    154. LARGE_INTEGER EndOfFile;
    155. LARGE_INTEGER AllocationSize;
    156. ULONG FileAttributes;
    157. ULONG FileNameLength;
    158. ULONG EaSize;
    159. CCHAR ShortNameLength;
    160. WCHAR ShortName[12];
    161. WCHAR FileName[1];
    162. } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
    163.  
    164. typedef DWORD (WINAPI* RTLINITUNICODESTRING)(PUNICODE_STRING DestinationString, PCWSTR SourceString);
    165. RTLINITUNICODESTRING RtlInitUnicodeString;
    166.  
    167. typedef DWORD (WINAPI* NTCREATEFILE)(PHANDLE FileHandle,
    168.                                      ACCESS_MASK DesiredAccess,
    169.                                      POBJECT_ATTRIBUTES ObjectAttributes,
    170.                                      PIO_STATUS_BLOCK IoStatusBlock,
    171.                                      PLARGE_INTEGER AllocationSize OPTIONAL,
    172.                                      ULONG FileAttributes,
    173.                                      ULONG ShareAccess,
    174.                                      ULONG CreateDisposition,          
    175.                                      ULONG CreateOptions,          
    176.                                      PVOID EaBuffer OPTIONAL,  
    177.                                      ULONG EaLength);
    178. NTCREATEFILE NtCreateFile;
    179.  
    180. typedef DWORD (WINAPI* NTCREATEEVENT)(PHANDLE EventHandle,
    181.                                       ACCESS_MASK DesiredAccess,
    182.                                       POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    183.                                       EVENT_TYPE EventType,
    184.                                       BOOLEAN InitialState);
    185. NTCREATEEVENT NtCreateEvent;
    186.  
    187. typedef DWORD (WINAPI* NTQUERYDIRECTORYFILE)(HANDLE FileHandle,
    188.                                              HANDLE Event OPTIONAL,
    189.                                              PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    190.                                              PVOID ApcContext OPTIONAL,
    191.                                              PIO_STATUS_BLOCK IoStatusBlock,
    192.                                              PVOID FileInformation,
    193.                                              ULONG Length,
    194.                                              FILE_INFORMATION_CLASS FileInformationClass,
    195.                                              BOOLEAN ReturnSingleEntry,
    196.                                              PUNICODE_STRING FileName OPTIONAL,
    197.                                              BOOLEAN RestartScan);
    198. NTQUERYDIRECTORYFILE NtQueryDirectoryFile;
    199.  
    200. typedef DWORD (WINAPI* NTWAITFORSINGLEOBJECT)(HANDLE Handle,
    201.                                              BOOLEAN Alertable,
    202.                                              PLARGE_INTEGER Timeout OPTIONAL);
    203. NTWAITFORSINGLEOBJECT NtWaitForSingleObject;
    204.  
    205. typedef DWORD (WINAPI* RTLUNICODESTRINGTOANSISTRING)(PANSI_STRING DestinationString,
    206.                                                      PCUNICODE_STRING SourceString,
    207.                                                      BOOLEAN AllocateDestinationString);
    208. RTLUNICODESTRINGTOANSISTRING RtlUnicodeStringToAnsiString;
    209.  
    210. typedef DWORD (WINAPI* NTCLOSE)(HANDLE hObject);
    211. NTCLOSE NtClose;
    212.  
    213. int main(ULONG argc, LPSTR *argv)
    214. {
    215.     HMODULE hNtdll;
    216.     OBJECT_ATTRIBUTES RootDirectoryAttributes;
    217.     UNICODE_STRING RootDirectoryName;
    218.     NTSTATUS Status;
    219.     HANDLE RootDirectoryHandle;
    220.     IO_STATUS_BLOCK Iosb;
    221.     HANDLE Event;
    222.     PUCHAR Buffer[65536];
    223.     PFILE_BOTH_DIR_INFORMATION DirInformation;
    224.     ANSI_STRING as;
    225.  
    226.     hNtdll = LoadLibrary ("ntdll.dll");
    227.  
    228.     RtlInitUnicodeString = (RTLINITUNICODESTRING) GetProcAddress (hNtdll, "RtlInitUnicodeString");
    229.     NtCreateFile = (NTCREATEFILE) GetProcAddress (hNtdll, "NtCreateFile");
    230.     NtCreateEvent = (NTCREATEEVENT) GetProcAddress (hNtdll, "NtCreateEvent");
    231.     NtQueryDirectoryFile = (NTQUERYDIRECTORYFILE) GetProcAddress (hNtdll, "NtQueryDirectoryFile");
    232.     NtWaitForSingleObject = (NTWAITFORSINGLEOBJECT) GetProcAddress (hNtdll, "NtWaitForSingleObject");
    233.     RtlUnicodeStringToAnsiString = (RTLUNICODESTRINGTOANSISTRING) GetProcAddress (hNtdll, "RtlUnicodeStringToAnsiString");
    234.     NtClose = (NTCLOSE) GetProcAddress (hNtdll, "NtClose");
    235.  
    236.     RtlInitUnicodeString (&RootDirectoryName, L"\\DosDevices\\C:\\");
    237.    
    238.     InitializeObjectAttributes (&RootDirectoryAttributes, &RootDirectoryName, OBJ_CASE_INSENSITIVE, 0, 0);
    239.  
    240.     Status = NtCreateFile (&RootDirectoryHandle,
    241.                            GENERIC_READ,
    242.                            &RootDirectoryAttributes,
    243.                            &Iosb,
    244.                            0,
    245.                            FILE_ATTRIBUTE_DIRECTORY,
    246.                            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    247.                            FILE_OPEN,
    248.                            FILE_DIRECTORY_FILE,
    249.                            0, 0);
    250.    
    251.     if (!NT_SUCCESS(Status))
    252.     {
    253.         printf("Unable to open %s, error = 0x%x\n", &RootDirectoryName, Status);
    254.         return Status;
    255.     }
    256.  
    257.     Status = NtCreateEvent (&Event, GENERIC_ALL, 0, NotificationEvent, FALSE);
    258.     if (!NT_SUCCESS(Status))
    259.     {
    260.         printf("Event creation failed with error 0x%x\n", Status);
    261.         return Status;
    262.     }
    263.  
    264.     Status = NtQueryDirectoryFile (RootDirectoryHandle,
    265.                                    Event, 0, 0,
    266.                                    &Iosb,
    267.                                    Buffer,
    268.                                    sizeof(Buffer),
    269.                                    FileBothDirectoryInformation,
    270.                                    FALSE,
    271.                                    NULL,
    272.                                    FALSE);
    273.     if (Status == STATUS_PENDING)
    274.     {
    275.         Status = NtWaitForSingleObject (Event, TRUE, 0);
    276.     }
    277.    
    278.     if (!NT_SUCCESS(Status))
    279.     {
    280.         printf("Unable to query directory contents, error 0x%x\n", Status);
    281.         return Status;
    282.     }
    283.  
    284.  
    285.     DirInformation = (PFILE_BOTH_DIR_INFORMATION) Buffer;
    286.     while (1)
    287.     {
    288.         UNICODE_STRING EntryName;
    289.         EntryName.MaximumLength = EntryName.Length = (USHORT) DirInformation->FileNameLength;
    290.         EntryName.Buffer = &DirInformation->FileName[0];
    291.        
    292.         RtlUnicodeStringToAnsiString(&as,&EntryName,TRUE);
    293.         printf("%s : %u\n", as.Buffer,DirInformation->AllocationSize.QuadPart);
    294.        
    295.         if (0 == DirInformation->NextEntryOffset)
    296.         {
    297.             break;
    298.         }
    299.         else
    300.         {
    301.             DirInformation = (PFILE_BOTH_DIR_INFORMATION) (((PUCHAR)DirInformation) + DirInformation->NextEntryOffset);
    302.         }
    303.        
    304.         printf("\n");
    305.     }
    306.  
    307.     NtClose(RootDirectoryHandle);
    308.     return 0;
    309. }
    OS у меня XP SP2 x64.
    Кроме того если кто знает как (можно и в теории) организовать поиск по всему диску?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    добавить libcmt.lib или отключить проверку стека
    ZwQueryDirectoryFile описан в ддк, что неясно?
    можно например перебрать все символьные ссылки вида "\??\X:" где X - буква английского алфавита
     
  3. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    я имел ввиду примеры работы с NtQueryDirectoryFile в плане рекурсии... наподобе с FindFirstFile и FindNextFile.
    это для того чтобы шариться по всем дискам, а мне бы для начала хотя бы по одному пошприться, короче это прога выдаёт список файлов конкретной папки, надо бы заюзать по всему диску.
    за совет спасибо, попробую...
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    glukker
    Вы бы вначале научились рекурсивно юзать FindFirstFile и FindNextFile. А потом уже шли на уровень ниже.
     
  5. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Что не очень помогло, то есть совсем не помогло, ошибок ещё больше стало ((((
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2001: unresolved external symbol @__security_check_cookie@4
    find error LNK2005: __chkstk already defined in ntdll.lib(ntdll.dll)
    find error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function __output
    find fatal error LNK1120: 1 unresolved externals
     
  6. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    TermoSINteZ
    вот интересно Вы сами то умеете её юзать или так просто напичали...
    Лучше бы по теме помогли...
    Код (Text):
    1. #include "stdafx.h"
    2. #include "windows.h"
    3.  
    4. void FindDir(char* path,char* mask)
    5. {  
    6.     WIN32_FIND_DATA wfd;    
    7.     HANDLE hfound;  
    8.     char newpath[MAX_PATH];
    9.     char fpath[MAX_PATH];  
    10.     char pathifile[MAX_PATH];
    11.     char delpath[MAX_PATH];
    12.     strcpy(fpath,path);
    13.     strcat(fpath,"\\");
    14.     strcpy(delpath,fpath);  
    15.     strcat(fpath,mask);
    16.  
    17.  
    18.     if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)    
    19.         {
    20.         if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))  
    21.             {
    22.             printf (wfd.cFileName);
    23.      printf ("\n");
    24.             }
    25.         while(FindNextFile(hfound,&wfd))    
    26.             {  
    27.             if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))  
    28.                 {
    29.                 strcpy(pathifile, delpath);
    30.                 strcat(pathifile, wfd.cFileName);      
    31.                
    32.                 printf (wfd.cFileName);
    33.          printf ("\n");
    34.  
    35.                 }
    36.             }
    37.         }
    38.        
    39.     FindClose(hfound);  
    40.     strcpy(fpath,path);
    41.     strcat(fpath,"\\*.*");  
    42.    
    43.     if((hfound=FindFirstFile(fpath,&wfd))=INVALID_HANDLE_VALUE)    
    44.         {
    45.         if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))    
    46.             {
    47.             strcpy(newpath,path);  
    48.             strcat(newpath,"\\");  
    49.             strcat(newpath,wfd.cFileName);  
    50.             FindDir(newpath,mask);
    51.             }
    52.        
    53.         while(FindNextFile(hfound,&wfd))    
    54.             {
    55.             if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&strcmp(wfd.cFileName,"..")&strcmp(wfd.cFileName,"."))    
    56.                 {
    57.                 strcpy(newpath,path);  
    58.                 strcat(newpath,"\\");  
    59.                 strcat(newpath,wfd.cFileName);  
    60.                 FindDir(newpath,mask);
    61.                 }
    62.             }
    63.         }
    64.     }
    65. ///////////////////////////////////////////////////////
    66. void main()
    67. {
    68.     FindDir("c:\\","*.*");
    69.     Sleep(5000);
    70. }
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    glukker
    Вы сомневаетесь в моей компетенции?

    Доказывать ничего не буду. По теме, если умеете использовать FFF, FNF , то и с ZwQueryDirectoryFile не должно быть никаких проблем. Она возвращает информацию о содержимом каталога, делай рекурсивную процедурку, вызывающую ZwQueryDirectoryFile . Обрати внимание на поле FILE_INFORMATION_CLASS (нужен FileFullDirectoryInformation). Есть одноименная структура. В ней все, что тебе нужно, а именно: поля NextEntryOffset, FileAttributes.
     
  8. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Я и не сомневался, просто зачем так резко и однозначно...
    Извиняюсь...
    Как насчёт STATUS_NO_MORE_FILES и STATUS_NO_SUCH_FILE ?
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    То есть файлов там нет. Если судить по описанию .

    Проверьте правильность задания класса, как вы вызываете ZwQueryDirectoryFile. Правильно ли получен дескриптор каталога, где ведется поиск. Привелегия FILE_LIST_DIRECTORY у него имется?
     
  10. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    ОК, врубил...
    А как насчёт того, что DDK компилит, но прога падает при запуске, а VS отказывается линковать?
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    glukker
    Прога падает? Хз,. отладчик поможет. У меня таких проблем небыло.
    VS линкует отлично все, в разделе CodeGeneration выруби нафиг все буфер\стек секурити ческ, ртс тоже выруби.
    Так включи в разделе Linker - Ignore All Default library. подруби туда kernel32.lib ntdll.lib
    Включи пути к ддк. Установи вручную точку входа.

    Совственно у меня линкует :)
     
  12. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    glukker
    Нет слов один мат. Сходи в поиск по васму по словам ZwQueryDirectoryFile, или отладчик поюзай, и посмотри что там и где падает.
     
  13. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    да нахрен ходить одни перехваты...
    да не говори, всё что знал уже излил ))) может всё из-за XP x64 недавно поставил... раньше таких проблем не наблюдалось!!!!
     
  14. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    щас проверим...
     
  15. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Ладно хоть глюки и сохранились попробую откомпилировать на x32 винде...
     
  16. sxd

    sxd Виталий

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    56
    Адрес:
    Москва
    glukker
    посмотри здесь http://overclok.free.fr/Codes/h0l0c4ust/h0l0c4ustIDll.htm
    кусок кода, точно не знаю то или не то, посмотри...
    Код (Text):
    1. NTSTATUS __stdcall myNtQueryDirectoryFile(HANDLE FileHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,PIO_STATUS_BLOCK IoStatusBlock,PVOID FileInformation,ULONG FileInformationLength,FILE_INFORMATION_CLASS FileInformationClass,BOOLEAN ReturnSingleEntry,PUNICODE_STRING FileName,BOOLEAN RestartScan)
    2. {
    3.  
    4.     char *hideMe = "_h0l0c4ust_" , nomDossierC[MAX_PATH];
    5.  
    6.     NTSTATUS retour = pNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,FileInformationLength,FileInformationClass,ReturnSingleEntry,FileName,RestartScan);
    7.     if( (retour == STATUS_SUCCESS) &&
    8.         ((FileInformationClass == FileDirectoryInformation) ||
    9.         (FileInformationClass == FileFullDirectoryInformation) ||
    10.         (FileInformationClass == FileBothDirectoryInformation) ||
    11.         (FileInformationClass == FileNameInformation))
    12.         )
    13.     {
    14.         //OutputDebugString("Succès de l'appel à la fonction.");
    15.         ULONG nombreLettre , nextOffset = 1 , lastNextOffset = 0;
    16.         PVOID nomDossier = NULL , pointeurStructActuel = FileInformation , pointeurLastStruct = NULL;
    17.         PULONG pointeurAvantNextOffset = NULL ;
    18.  
    19.         do
    20.         {
    21.             switch(FileInformationClass)
    22.             {
    23.                 case FileDirectoryInformation :
    24.                     if(pointeurLastStruct != NULL) // si ce n'est pas la première struct ,on recup un pointeur sur le NextEntryOffset.
    25.                     {
    26.                         pointeurAvantNextOffset = &(((PFILE_DIRECTORY_INFORMATION)pointeurLastStruct)->NextEntryOffset);
    27.                     }
    28.                     nombreLettre = ((PFILE_DIRECTORY_INFORMATION)pointeurStructActuel)->FileNameLength; //On recupère les infos dont on a besoin ,à savoir :,nom du dossier ,NextOffset
    29.                     nomDossier = ((PFILE_DIRECTORY_INFORMATION)pointeurStructActuel)->FileName; //nombres de lettres ,
    30.                     nextOffset = ((PFILE_DIRECTORY_INFORMATION)pointeurStructActuel)->NextEntryOffset; //NextOffset .
    31.                     break;
    32.  
    33.                 case FileFullDirectoryInformation :
    34.                     if(pointeurLastStruct != NULL)
    35.                     {
    36.                         pointeurAvantNextOffset = &(((PFILE_FULL_DIRECTORY_INFORMATION)pointeurLastStruct)->NextEntryOffset);
    37.                     }
    38.                     nombreLettre = ((PFILE_FULL_DIRECTORY_INFORMATION)pointeurStructActuel)->FileNameLength;
    39.                     nomDossier = ((PFILE_FULL_DIRECTORY_INFORMATION)pointeurStructActuel)->FileName;
    40.                     nextOffset = ((PFILE_FULL_DIRECTORY_INFORMATION)pointeurStructActuel)->NextEntryOffset;
    41.                     break;
    42.  
    43.                 case FileBothDirectoryInformation :
    44.                     if(pointeurLastStruct != NULL)
    45.                     {
    46.                         pointeurAvantNextOffset = &(((PFILE_BOTH_DIRECTORY_INFORMATION)pointeurLastStruct)->NextEntryOffset);
    47.                     }
    48.                     nombreLettre = ((PFILE_BOTH_DIRECTORY_INFORMATION)pointeurStructActuel)->FileNameLength;
    49.                     nomDossier = ((PFILE_BOTH_DIRECTORY_INFORMATION)pointeurStructActuel)->FileName;
    50.                     nextOffset = ((PFILE_BOTH_DIRECTORY_INFORMATION)pointeurStructActuel)->NextEntryOffset;
    51.                     break;
    52.  
    53.                 case FileNameInformation :
    54.                     if(pointeurLastStruct != NULL)
    55.                     {
    56.                         pointeurAvantNextOffset = &(((PFILE_NAMES_INFORMATION)pointeurLastStruct)->NextEntryOffset);
    57.                     }
    58.                     nombreLettre = ((PFILE_NAMES_INFORMATION)pointeurStructActuel)->FileNameLength;
    59.                     nomDossier = ((PFILE_NAMES_INFORMATION)pointeurStructActuel)->FileName;
    60.                     nextOffset = ((PFILE_NAMES_INFORMATION)pointeurStructActuel)->NextEntryOffset;
    61.                     break;
    62.             }
    63.             memset(nomDossierC,'\0',sizeof(nomDossierC));
    64.             WideCharToMultiByte(CP_ACP, 0, nomDossier, nombreLettre/2, nomDossierC, sizeof(nomDossierC)-1, NULL, NULL);
    65.             //OutputDebugString(nomDossierC);
    66.  
    67.             if(DossierAvecPrefixe(hideMe,strlen(hideMe),nomDossierC))
    68.             {
    69.                 //OutputDebugString("HIDE DU FICHIER");
    70.                 memset(nomDossierC,'\0',sizeof(nomDossierC));
    71.                 if( nextOffset == 0) //Si c'est la dernière struct ,on modifie le NextOffset à 0 ,on gruge alors la dernière struct :).
    72.                 {
    73.                     *pointeurAvantNextOffset = 0;
    74.                     break;
    75.                 }
    76.                 else if(pointeurLastStruct == NULL  ) //Si c'est la première struct ,on décalle directement toutes les structs.
    77.                 {
    78.                     CopyMemory(pointeurStructActuel,(PULONG)((ULONG)pointeurStructActuel + nextOffset),FileInformationLength);
    79.                 }
    80.                 else //Sinon ,cas plutot général : on modifie le NextOffset de la struct précédente par rapport à l'actuel ,pour la faire pointer vers la prochaine encore une fois par rapport à l'actuel.
    81.                 {
    82.                     lastNextOffset = lastNextOffset + nextOffset;
    83.                     *pointeurAvantNextOffset = lastNextOffset;
    84.                     pointeurStructActuel = (PVOID)((ULONG)pointeurStructActuel + nextOffset);
    85.                 }
    86.             }
    87.             else // si rien nous interesse on sauvegarde les pointeurs et co ,et on passe à la suivante.
    88.             {
    89.                 lastNextOffset = nextOffset;
    90.                 pointeurLastStruct = pointeurStructActuel;
    91.                 pointeurStructActuel = (PVOID)((ULONG)pointeurStructActuel + nextOffset);
    92.             }
    93.             memset(nomDossierC,'\0',sizeof(nomDossierC));
    94.         }while(nextOffset != 0);
    95.     }
    96.     return retour;
    97. }
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Могу скинуть исходники поиска файлов на WINAPI
     
  18. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Clerk спасибо тебе все бы были такие дружелюбные... Но код поиска файлов на WinAPI, я сам выложил в сообщении #6, он рабочий использует рекурсивный вызов функции... Но мне нужна функция поиска именно на NtQueryDirectoryFile, вот если бы ты смог помоч с ней ((((((((((((
    sxd
    спасибо но мне её перехватывать совсем не нужно...
    ей нужно просто воспользоваться для поиска...
     
  19. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Clerk
    хотя и твой бы код на апях посмотрел, может он более компактный, чем тот что у меня...
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Написано было это года четыре назад, будет время напишу на нативе.
    Код (Text):
    1. StartSearch proto :dword,:dword     ;ptr lpPath,ptr dwWfd
    2. ;Начинает перечисление файлов
    3. ;1-й параметр: указатель на путь поиска например C:\Windows или D:\
    4. ;2-й параметр: указатель на двойное слово принимающее адрес структуры SRC32 через которую передаётся информация о найденном файле
    5. ;Возвращается в случае успеха хэндл поиска,иначе ноль
    6. Search      proto :dword,:dword     ;hSrc,ptr SRC32FILES
    7. ;вызывается циклически для перечисления файлов.
    8. ;1-й параметр: хэндл поиска,возвращённый StartSearch
    9. ;2-й параметр: указатель на структуру SRC32FILES,принимающую общее число найденых файлов и папок
    10. ;Возвращается в случае успеха указатель на двойное слово принимающее адрес структуры SRC32 через которую передаётся информация о найденном файле,
    11. ;если ноль то поиск закончен
    12. StopSearch  proto :dword        ;hSrc
    13. ;Принудительно завершает перечисление.
    14. ;1-й параметр: хэндл поиска
    15.  
    16. SRC32FILES struct  
    17. nFiles  dd ?    ;Число файлов,увеличивается на 1 с каждым найденным файлом
    18. nDir    dd ?    ;Число папок,увеличивается на 1 с каждой найденной папкой
    19. SRC32FILES ends
    20.  
    21. SRC32 struct
    22. wfd WIN32_FIND_DATA <>  ;Структура принимающая информацию о найденном файле
    23. lBuf    db MAX_PATH dup (0) ;буфер строки с путём + '\*'
    24. SRC32 ends
    25.  
    26. SRC32FILES struct
    27. nFile   dd ?
    28. nDir    dd ?
    29. SRC32FILES ends
    30.  
    31. FIND32 struct
    32. SignL   dd ?        ;Сигнатура 'xSea'
    33. SignH   dd ?        ;Сигнатура 'rch_'
    34. hMem    dd ?        ;хэндл памяти
    35. nFile   dd ?        ;число найденных файлов
    36. nDir    dd ?        ;число найденных папок
    37. pHandle dd ?        ;номер текущего элемента таблицы дескрипторов *4
    38. Handles dd MAX_PATH dup (0) ;таблица дескрипторов FindFirstFile
    39. wfd WIN32_FIND_DATA <>  ;Структура принимающая информацию о найденном файле
    40. lBuf    db MAX_PATH dup (0) ;буфер строки с путём + '\*'
    41. FIND32 ends
    42. .code
    43. ;-------------------------------------------------------------------------------   
    44. StartSearch proc uses edi esi lpDir:dword,srcWfd:dword
    45. Local Vari:dword,srcfiles:SRC32FILES
    46. ;Процедура инициализации параметров поиска
    47. ;Выделяем память
    48.     invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,sizeof FIND32 ;выделяем блок памяти
    49.     mov Vari,eax        ;hMem
    50.     invoke GlobalLock,eax   ;Определяем адрес его
    51.     mov edi,eax ;указатель на FIND32
    52.     assume edi:ptr FIND32
    53.     mov eax,Vari
    54.     mov [edi].hMem,eax      ;хэндл памяти
    55.     mov [edi].SignL,'xSea'  ;младший DWORD сигнатуры структуры
    56.     mov [edi].SignH,'rch_'  ;старший DWORD сигнатуры структуры
    57.     xor eax,eax
    58.     mov [edi].pHandle,eax       ;pHandle указывает на первый элемент Handles
    59.     mov [edi].nFile,eax
    60.     mov [edi].nDir,eax     
    61.     lea esi,[edi].lBuf      ;esi-адрес строки в буфере
    62.     invoke lstrcpy,esi,lpDir    ;копируем путь в буфер
    63.     invoke GetFileAttributes,esi    ;<ERROR_PATH_NOT_FOUND>
    64.     cmp eax,-1
    65.     jz initerr_
    66.     invoke lstrlen,esi      ;определяем длину пути
    67.     add eax,esi     ;...0
    68.     cmp byte ptr [eax-1],'\'
    69.     .if Zero?
    70.     dec eax
    71.     .endif
    72.     mov dword ptr [eax],'*\'    ;добавляем его
    73.     lea eax,[edi].wfd  
    74.     invoke FindFirstFile,esi,eax    ;начинаем поиск
    75.     mov Vari,eax        ;хэндл поиска
    76.     cmp eax,INVALID_HANDLE_VALUE
    77.     jz initerr_
    78.     lea ecx,[edi].Handles   ;адрес текущего элемента таблицы хэндлов
    79.     mov [ecx],eax       ;сохраняем хэндл поиска
    80.     add [edi].pHandle,4     ;указатель на следующий элемент таблица
    81.     cmp byte ptr [edi].wfd.cFileName,'.'   
    82.     .if !Zero?
    83.        mov eax,[edi].wfd.dwFileAttributes
    84.        test eax,16
    85.        .if Zero?
    86.        inc [edi].nFile
    87.        .else
    88.        inc [edi].nDir
    89.        .endif
    90.     .else
    91.     invoke Search,edi,addr srcfiles
    92.     test eax,eax
    93.     jz pexit_
    94.     .endif
    95. findok_:
    96.     mov edx,srcWfd      ;указатель на адрес wfd
    97.     lea eax,[edi].wfd       ;адрес wfd
    98.     mov [edx],eax       ;сохраняем pWfd   
    99.     mov eax,edi     ;адрес структуры возвращаем в качестве хэндла поиска  
    100.     jmp pexit_         
    101. initerr_:      
    102.     mov edi,[edi].hMem
    103.     invoke GlobalUnlock,edi
    104.     invoke GlobalFree,edi
    105.     xor eax,eax
    106. pexit_:
    107.     ret
    108. StartSearch endp
    109. ;-------------------------------------------------------------------------------
    110. FindSlash proc
    111.     lea eax,[edi].lBuf
    112.     invoke lstrlen,eax
    113.     sub eax,3
    114.     lea edx,[edi].lBuf
    115.     add eax,edx
    116. slashlp:
    117.     dec eax
    118.     cmp byte ptr [eax],'\'
    119.     jz slashok
    120.     cmp byte ptr [eax],'\'
    121.     jz slashok 
    122.     cmp eax,edx
    123.     ja slashlp
    124.     xor eax,eax    
    125. slashok:
    126.     test eax,eax
    127.     .if !Zero?
    128.     mov dword ptr [eax],'*\'    ;...\*
    129.     .endif
    130.     ret
    131. FindSlash endp
    132. ;-------------------------------------------------------------------------------
    133. Search proc uses edi esi pMem:dword,pInfo:dword
    134. Local Vari:dword
    135.     mov edi,pMem
    136.     assume edi:ptr FIND32
    137.     mov eax,[edi].SignL         ;проверяем сигнатуру
    138.     cmp eax,'xSea'
    139.     jnz handleerr_
    140.     mov eax,[edi].SignH
    141.     cmp eax,'rch_'
    142.     jnz handleerr_
    143.     lea esi,[edi].lBuf          ;адрес строки в буфере
    144. next1_:
    145.     mov eax,[edi].pHandle
    146.     test eax,eax
    147.     jz closesrc_
    148.     mov al,byte ptr [edi].wfd.cFileName
    149.     cmp al,'.'          ;если вызывается из StartSearch
    150.     jz findfile_       
    151.     mov eax,[edi].wfd.dwFileAttributes
    152.     test eax,16         ;если не ноль то файл - каталог
    153.     jz findfile_
    154.     invoke lstrlen,esi
    155.     add eax,esi         ;Path\*0
    156.     dec eax             ;Path\*
    157.     lea edx,[edi].wfd.cFileName
    158.     invoke lstrcpy,eax,edx      ;дописываем имя каталога,Path\FileName0
    159.     invoke lstrlen,esi          ;длина строки в буфере
    160.     add eax,esi         ;...0
    161.     mov dword ptr [eax],'*\'        ;Path\FileName0\*
    162.     lea eax,[edi].wfd
    163.     invoke FindFirstFile,esi,eax   
    164.     cmp eax,INVALID_HANDLE_VALUE   
    165.     jz finddirerr_
    166.     mov edx,[edi].pHandle
    167.     lea ecx,[edi].Handles
    168.     mov [edx+ecx],eax
    169.     add [edi].pHandle,4
    170.     jmp nextfile_          
    171. finddirerr_:
    172.     invoke FindSlash
    173. findfile_:
    174.     lea edx,[edi].wfd           ;адрес Wfd
    175.     lea ecx,[edi].Handles - 4
    176.     mov eax,[edi].pHandle          
    177.     mov eax,[eax+ecx]
    178.     invoke FindNextFile,eax,edx
    179.     test eax,eax
    180.     jnz nextfile_
    181.     invoke GetLastError
    182.     cmp eax,ERROR_NO_MORE_FILES     ;в директории больше файлов не найдено
    183.     jnz findfile_  
    184.     mov edx,[edi].pHandle       ;указатель на хэндл поиска   
    185.     lea ecx,[edi].Handles - 4
    186.     mov eax,[edx+ecx]
    187.     invoke FindClose,eax
    188.     sub [edi].pHandle,4
    189.     jz closesrc_
    190.     invoke FindSlash            ;в каталоге больше нет файлов
    191.     jmp findfile_      
    192. nextfile_:
    193.     mov al,byte ptr [edi].wfd.cFileName
    194.     cmp al,'.'
    195.     jz findfile_
    196.     mov eax,[edi].wfd.dwFileAttributes
    197.     test eax,16
    198.     .if Zero?
    199.     inc [edi].nFile
    200.     .else
    201.     inc [edi].nDir
    202.     .endif
    203.     mov edx,pInfo
    204.     mov eax,[edi].nFile
    205.     mov dword ptr [edx],eax
    206.     mov eax,[edi].nDir
    207.     mov [edx+4],eax
    208.     mov eax,edi         ;адрес структуры возвращаем в качестве хэндла поиска  
    209.     jmp pexit_
    210. handleerr_:
    211.     invoke SetLastError,ERROR_INVALID_HANDLE
    212.     mov eax,INVALID_HANDLE_VALUE   
    213.     jmp pexit_ 
    214. closesrc_:
    215.     mov edi,[edi].hMem
    216.     invoke GlobalUnlock,edi ;освобождаем память
    217.     invoke GlobalFree,edi
    218.     invoke SetLastError,ERROR_NO_MORE_FILES
    219.     xor eax,eax
    220. pexit_:        
    221.     ret
    222. Search endp
    223. ;-------------------------------------------------------------------------------
    224. StopSearch proc uses edi esi pMem:dword
    225.     mov edi,pMem
    226.     assume edi:ptr FIND32
    227.     mov eax,[edi].SignL     ;проверяем сигнатуру
    228.     cmp eax,'xSea'
    229.     jnz memerr_
    230.     mov eax,[edi].SignH
    231.     cmp eax,'rch_'
    232.     jnz memerr_
    233.     mov esi,[edi].pHandle
    234.     test esi,esi
    235.     jz freemem_
    236.    
    237.     push edi
    238.     lea edi,[edi].Handles - 4
    239. stoplp_:
    240.     mov eax,dword ptr [edi+esi]
    241.     invoke FindClose,eax
    242.     sub esi,4
    243.     jnc stoplp_
    244.     pop edi
    245.  
    246.     mov edi,[edi].hMem
    247.     invoke GlobalUnlock,edi ;освобождаем память
    248.     invoke GlobalFree,edi
    249.     mov eax,TRUE
    250.     jmp pexit_
    251. freemem_:
    252.     invoke SetLastError,ERROR_SUCCESS
    253.     mov eax,TRUE
    254.     jmp pexit_
    255. memerr_:
    256.     invoke SetLastError,ERROR_INVALID_HANDLE
    257.     mov eax,INVALID_HANDLE_VALUE   
    258. pexit_:
    259.     ret
    260. StopSearch endp