правила записи строк в файл в ядре

Тема в разделе "WASM.BEGINNERS", создана пользователем donaire, 28 апр 2006.

  1. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    CCHAR buf[16];

    где-то, например в обратной ф-ии считывая коды клавиш:



    sprintf(dev_ext->mass_zapis[ngran + i], "%x", KeyData.MakeCode)

    (аналогично DbgPrint)



    в другом месте:



    sprintf(buf, "%d", dev_ext->mass_zapis);

    status = ZwWriteFile(hfile, NULL, NULL, NULL, &io_status_block, buf, sizeof(CCHAR), NULL, NULL);



    в результате в файл записываются квадраты, а не буквы. Как сделать правильно? Может есть ссылка на статью по правилам работы со строками в ядре? Что за типы данных, из статей б-менее понятна только структура UNICODE_STRING.

    Спасибо!
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    На сайте есть KmdKit.

    Скачай, посмотри, там есть пример работы с файлами.
     
  3. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Где он? Поиск выдаёт ошибку, сразу адреса не видно, если есть ссылка под боком, скиньте.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    иди сюда:

    http://four-f.narod.ru/



    Хотя оттуда не качается :dntknw:

    По-крайней мере у меня.

    Так что ищите тут, на васме
     
  5. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Надо правой кнопкой Сэйв таргет аз и тогда качается КмдКит, по крайней мере. У меня*))

    Только где сам Фоур-Ф, он прошлый раз мне помог наполовину, обещал ежели чего продолжить. Но не пишет...
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Таких как ты, у него десятки и сотни :)

    Закачай DbgView и перед записью в файл проверяй при помощи DbgPrint, что находится в записываемом буфере.
     
  7. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    DbgPrint пишет всё нормально, а в файле оказываются квадраты. Ладно, ещё попробую поискать исходники. Я ведь хотел вообще краткую теорию как работать со строками в ядре. Честно говоря, я даже в обычном режиме часто ошибки делаю со строками*)))



    sprintf(dev_ext->mass_zapis[ngran + i], "%x", KeyData.MakeCode)



    Здесь можно применять только %x, %s вызовет синий экран.

    значит в массив mass_zapis запишется число. Теперь как его преобразовать в строку. То есть я записываю символ, приходящий с клавиатуры в массив в обработчике, а потом его в файл записываю в другом месте, где можно вызвыть ф-ю записи в файл.

    В обычном коде я бы записал этот символ с %s как строку, а потом бы переписал как строку в файл.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Подожди, какое число ты хочешь преобразовать в строковое выражение и вывести через буфер в файл?



    sprintf(dev_ext->mass_zapis[ngran + i], "%x", KeyData.MakeCode)

    (аналогично DbgPrint)



    в другом месте:



    sprintf(buf, "%d", dev_ext->mass_zapis);



    Это не кажется странным? Число KeyData.MakeCode преобразуется в строку, а затем к строке применяется %d???



    Какого рода переменные dev_ext->mass_zapis[ngran + i] и KeyData.MakeCode?



    Если dev_ext->mass_zapis[ngran + i] - это буфер достаточной длины, чтобы в нем поместилась строка типа "F0053ADC" (9 байт), то форматтер можно %s, в противном случае естественно будет синий экран.

    Возьми и попробуй так:


    Код (Text):
    1. char    buf[128];
    2.  
    3. sprintf (buf, "%s", KeyData[i].MakeCode);
    4. status = ZwWriteFile(hfile,
    5.                      NULL,
    6.                      NULL,
    7.                      NULL,
    8.                      &io_status_block,
    9.                      buf,
    10.                      sizeof(CCHAR),
    11.                      NULL,
    12.                      NULL);




    Значение KeyData.MakeCode будет в виде строки записано в файл