Максимальный размер размер блока данных для записи (ZwWriteFile) ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем simon, 7 ноя 2010.

  1. simon

    simon New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2010
    Сообщения:
    19
    Имею код примерно следующего содержания :
    Код (Text):
    1.      NTSTATUS                 status;
    2.      UNICODE_STRING         DISK;
    3.      HANDLE                      fileHandle;
    4.      IO_STATUS_BLOCK       iostatus;
    5.      OBJECT_ATTRIBUTES    oa;
    6.      char                          Buff [3584];
    7.      LARGE_INTEGER           l_integr;
    8.  
    9.      l_integr.QuadPart = 0;
    10.      RtlZeroMemory(&Buff,sizeof(Buff));
    11.      RtlInitUnicodeString(&DISK,L"\\??\\PHYSICALDRIVE1");
    12.  
    13.      InitializeObjectAttributes(&oa,
    14.                 &DISK,
    15.                 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    16.                 NULL,
    17.                 NULL);
    18.  
    19.      status=ZwCreateFile(&fileHandle,
    20.                                  GENERIC_READ|GENERIC_WRITE | SYNCHRONIZE, &oa,&iostatus, 0, 0, 0,FILE_OPEN,
    21.                                  FILE_NO_INTERMEDIATE_BUFFERING|FILE_SYNCHRONOUS_IO_NONALERT,0,0 );
    22.     if(status != STATUS_SUCCESS)
    23.      {
    24.           DebugPrint(("Failed to create disk!\n"));
    25.           return status;
    26.       }
    27.     do
    28.      {
    29.           status = ZwWriteFile(fileHandle,0, NULL, NULL,&iostatus,(PVOID)Buff,sizeof(Buff),&l_integr, NULL);
    30.  
    31.           DebugPrint("\n Write to disk  =%X",l_integr.QuadPart);
    32.           l_integr.QuadPart = l_integr.QuadPart + (__int64)iostatus.Information;
    33.  
    34.      }while(!status);
    В выше указанном коде столкнулся со следующей проблемой при укании размера Buff больше чем 3968 хотя бы на 1, WDK 7600.16385.1 начинаеть ругаться ,так вот у меня вопрос счем это связанно, и можноли этот барьер преодолеть.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ты в курсе, что стека в ядре всего 12 КБ? А ты ажно ~4 КБ оттяпал. Если хотя бы 3 драйвера так тяпнут, то кирдык системе незамедлительно. Я советую буфера >1 КБ выделять из пула.

    Как именно? Возможно, компилятор обнаружил, что именно в этом месте столько стека использовать нельзя.
     
  3. simon

    simon New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2010
    Сообщения:
    19
    x64
    я впринципе еще не очень силен в написании драйверов )).
    А ответ компилятора таков: "error LNK2019: unresolved external symbol _chkstk referenced in function _DriverEntry@8".
     
  4. simon

    simon New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2010
    Сообщения:
    19
    x64
    Спасибо что наставил на путь истинный, вопрос снят.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну, совет выше я уже дал. Учись.

    Ну да, всё правильно, если стека используешь больше, чем 1 страница (т.е. 4096 байт на x86 и 8192 байта на x64), то получишь такое.