mingw32 выдает ошибку, когда я включаю ddk / winddk.h

Я новичок в среде Win, пытаюсь написать код, который использует API ядра Win, но на Ubuntu 10.04 ... с использованием mingw32 (точнее, i586-mingw32msvc)

Мой код:

#include<ddk/winddk.h>
int main()
{
        return 0;
}

Но я получаю много ошибок с заголовком ddk / winddk.h: Компиляция как: i586-mingw32msvc-gcc WaitForSingleObj_2.c

Все ошибки такие:

/usr/lib/gcc/i586-mingw32msvc/4.2.1-sjlj/../../../../i586-mingw32msvc/include/ddk/winddk.h:9208: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NTSTATUS'

Я что-то упускаю из-за этого? Когда я пытался скомпилировать с заголовками iostream и windows.h, это нормально работало.

РЕДАКТИРОВАТЬ:

#include<ntdef.h>
#include<ddk/ntddk.h>
#include<ddk/winddk.h>
#include<ddk/ntddndis.h>

int main()
{
        KTIMER *timer;
        KeInitializeTimer(timer);
        return 0;
}

до KTIMER все в порядке, теперь новая ошибка: /tmp/cc0epAQA.o:WaitForSingleObj_2.c:(.text+0x1d): undefined ссылка на `_ imp _KeInitializeTimer @ 4 'collect2: ld вернула 1 выход положение дел

Может ли кто-нибудь сказать мне, какой заголовочный файл включить плз?

Изменить: [Как уже прокомментировали другие, и я испытал (!) ПОЖАЛУЙСТА, постарайтесь избегать использования другой платформы для разработки ядра Windonws]

Я переключился на Visual C ++ Express, загрузил WDK, учитывая дополнительный путь включения из Project Property-> c / c ++ .. -> Дополнительный каталог Include (C: \ WinDDK \ 7600.16385.1 \ inc \ ddk; C: \ WinDDK \ 7600.16385. 1 \ inc \ api;)

НО (ненавижу это, но!) Я получаю много ошибок компиляции, например

    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2143: syntax error : missing ')' before 'const'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2143: syntax error : missing '{' before 'const'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2059: syntax error : ','
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2059: syntax error : ')'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(550): error C2143: syntax error : missing ')' before 'const'

Мой код:

#include <wdm.h>
int mian()
{
    /*
     * PKTIMER Timer;
     */
}

Если у кого-то есть идея, пожалуйста, помогите!


person code muncher    schedule 04.05.2012    source источник
comment
Вы уверены, что это файл заголовка верхнего уровня? Какие функции и типы вам нужны? Это правильный заголовочный файл для включения?   -  person David Heffernan    schedule 05.05.2012
comment
На самом деле я боюсь, что все, что вы пытаетесь сделать, не сработает, потому что ваши включаемые файлы, очевидно, смешивают функциональность пользовательского режима и режима ядра, которые просто никогда не будут работать. Несмотря на то, что ядро ​​имеет подмножество, оно, например, никогда не предоставит ничего, что позволяет вам использовать <iostream> ... если вы имеете в виду, что хотите использовать часть пользовательского режима собственного API, вы должны исправить это в своем вопросе, поскольку это совсем другое вещь и хрупкая вещь, когда вы пытаетесь использовать более сложные файлы заголовков WDK. Простые подойдут, более сложные обычно требуют особого ухода.   -  person 0xC0000022L    schedule 05.05.2012
comment
@STATUS_ACCESS_DENIED правильно, я не должен включать iostream ... позвольте мне отредактировать это ... но знаете ли вы, почему winddk.h доставляет мне проблемы?   -  person code muncher    schedule 05.05.2012
comment
Что ж, Windows.h также не имеет смысла в коде режима ядра. Кроме того, даже если вам не нравится это слышать, вам следует избегать написания драйверов с компиляторами, отличными от WDK. Если нужно, используйте ВИНО. В любом случае заголовки верхнего уровня зависят от модели вашего драйвера и могут быть ntddk.h или wdm.h ...   -  person 0xC0000022L    schedule 05.05.2012
comment
@DavidHeffernan Я проверил dir / usr / i586-mingw32msvc / с помощью cscope ... Мне нужен KTIMER, и он находится в winddk.h   -  person code muncher    schedule 05.05.2012
comment
@STATUS_ACCESS_DENIED правильно, я использую WINE ... но я хочу работать с Linux ..   -  person code muncher    schedule 05.05.2012
comment
@STATUS_ACCESS_DENIED wdm.h отсутствует, и теперь я попытался включить ddk / ntddk.h и ddk / winddk.h .. все еще не работает   -  person code muncher    schedule 05.05.2012
comment
Что ж, тебе следует знать свои инструменты. Разработка для KM под Windows (как и для многих других платформ) - не детская игра. Если ваше приложение единой системы обмена сообщениями выходит из строя, оно умирает. Если ваш драйвер выйдет из строя, система умрет. Пожалуйста, попробуйте использовать неподдерживаемые инструменты для создания драйверов KM для Windows. Не говоря уже о том, что ваше представление о драйверах, похоже, отсутствует в приведенном выше фрагменте кода. Он полностью отличается от единой системы обмена сообщениями, и к нему нельзя относиться легкомысленно.   -  person 0xC0000022L    schedule 05.05.2012
comment
Откуда они берутся? Дайте угадаю, это какие-то специфичные для MinGW заголовки? В этом случае вы, скорее всего, сами по себе, извините. Я думал, мы говорим здесь об официальных заголовках.   -  person 0xC0000022L    schedule 05.05.2012
comment
@STATUS_ACCESS_DENIED, вы правы, это из MinGW .. Официальный заголовок - Wdm.h, как вы сказали ... Я тоже видел на сайте разработки Windows ... ну на самом деле я хотел попробовать только Linux m / c ... и я согласен, он полностью отличается от UM ... посмотрю, если ничего не работает, может быть, я переключусь на VS ...   -  person code muncher    schedule 05.05.2012
comment
Я бы использовал для этого набор инструментов Microsoft, слишком много вещей может пойти не так, как надо, в кросс-компиляции. VmWare Player бесплатен, поэтому вы все равно можете разрабатывать под Linux, хотя вам, вероятно, понадобится лицензия для самой Windows. VS Express также бесплатен, но вам нужно будет подтвердить, что он может выполнять работу с драйверами устройства.   -  person paxdiablo    schedule 05.05.2012
comment
@ Дхара Дарджи: VS не нужен. Что нужно, так это среда сборки WDK, которая полностью независима от VS и компиляторов VS (раньше была зависимой до XP DDK, вероятно, снова станет зависимой с VS 11). Все они являются инструментами командной строки и должны для всех практических целей работать в WINE. Это означает, что вы все еще можете использовать свою любимую IDE / редактор в Linux ...   -  person 0xC0000022L    schedule 05.05.2012
comment
@STATUS_ACCESS_DENIED ооо, я этого не знал ... Я, конечно, использую Wine для "выполнения" a.exe, но не знаю, как использовать с такого рода проблемами, не могли бы вы привести мне какой-нибудь пример? Спасибо!   -  person code muncher    schedule 05.05.2012
comment
кто-нибудь знает, как работать с вином, чтобы собрать win-kernel ... установить mingw32 (sudo apt-get install mingw32) ... установить вино тоже ... но не знаю, как собрать этот код ...!   -  person code muncher    schedule 09.05.2012
comment
Ваш план почти гарантированно провалится по причинам, которые объяснили @STATUS_ACCESS_DENIED и paxdiablo. Я бы порекомендовал ткнуть себя в глаз острой палкой вместо того, чтобы пытаться разработать драйверы Windows KM с помощью неподдерживаемых инструментов. О, и каковы ваши шансы получить сертификат MS? Практически ноль.   -  person Carey Gregory    schedule 15.05.2012
comment
@CareyGregory, согласен, я отредактировал свой вопрос, чтобы прояснить его ...   -  person code muncher    schedule 15.05.2012
comment
@Dhara, обычно не рекомендуется менять основную природу вопроса, поскольку это делает ответы недействительными на сегодняшний день. Изменение вопроса для предоставления дополнительных сведений или внесение незначительных модификаций обычно считается приемлемым, но изменение его таким образом, чтобы это был совершенно новый вопрос (например, переход с MinGW на VC ++), является достаточной причиной для того, чтобы задать новый вопрос. В противном случае вся концепция вопросов и ответов рушится.   -  person paxdiablo    schedule 15.05.2012


Ответы (2)


Вы уверены, что ntdef.h включается явно или с помощью определенных #define значений? Это заголовок, который определяет NTSTATUS, и это сообщение об ошибке gcc обычно выдает, когда символ / тип не был определен.

В любом случае, разработка драйверов устройств Windows с использованием компилятора, отличного от MS, почти наверняка будет иметь больше проблем, чем с собственным набором инструментов Microsoft.

person paxdiablo    schedule 04.05.2012
comment
Я попытался включить ‹ntdef.h› ... получить такие же ошибки, И сообщения об ошибках предназначены не только для NTSTATUS, его для 'void', 'PBOOLEAN', 'ULONG' и т. Д. !! - person code muncher; 05.05.2012
comment
@DharaDarji: паксдиабло прав. Попытка разработать драйверы устройств Windows с использованием инструментов, отличных от Windows DDK, почти наверняка потерпит неудачу или, по крайней мере, будет чрезвычайно сложной. Разработать драйверы с помощью компиляторов Visual Studio непросто, а иногда и возможно (компиляторы WDK распознают параметры, которые не распознает VS). Драйверы устройств обычно относятся к конкретной операционной системе. Пытаться использовать инструменты из другой ОС - плохой выбор на любой платформе. - person Carey Gregory; 15.05.2012
comment
@CareyGregory правильно, я согласен с вами, я изменил, и теперь я считаю, что работать с VC ++ express, WDK kit на Windows7 должно быть хорошо ... позвольте мне удалить свою первую попытку, теперь это вводит в заблуждение - person code muncher; 15.05.2012

Дхара Дарджи, вы все еще не совсем поняли, о чем я писал раньше. Важен не только набор инструментов. Как я уже отмечал, вы не сможете сертифицировать свой драйвер (хотя вы можете получить его - или .cat - с перекрестной подписью). Я поддерживаю каждое слово из своего комментария:

Что ж, тебе следует знать свои инструменты. Разработка для KM под Windows (как и для многих других платформ) - не детская игра. Если ваше приложение единой системы обмена сообщениями выходит из строя, оно умирает. Если ваш драйвер выйдет из строя, система умрет. Пожалуйста, пересмотрите вариант использования неподдерживаемых инструментов для создания драйверов KM для Windows. Не говоря уже о том, что ваше представление о драйверах, похоже, отсутствует в приведенном выше фрагменте кода. Это полностью отличается от UM, и к нему нельзя относиться легкомысленно.

Даже сейчас, в вашей последней попытке, за исключением неправильно написанного main (как mian), вы, похоже, не знаете, что драйверу требуется точка входа с именем DriverEntry и что она принимает параметры, полностью отличные от классического main.

Как я уже отмечал ранее, вы смешиваете концепции пользовательского режима (UM) и режима ядра (KM). Это просто не сработает. Здесь нет никаких «если» и «но». Несколько лет назад люди даже утверждали, что C ++ - неподходящий язык для написания кода KM. В основном из-за семантики new и последствий для выгружаемого и невыгружаемого пула. В наши дни для проверки типов принят C ++. Вот и следующий "бассейн", что это? Вы должны изучить хотя бы основы внутреннего устройства Windows, и я боюсь, что, по крайней мере, издание «Windows ???? Internals», которое я читал в то время, не совсем его урезало. Вы захотите получить подходящую книгу о драйверах, такую ​​как Oney's «Programming the Microsoft Windows Driver Model» или несколько книг - включая старые названия - от ребят из OSR. Даже очень старые книги времен NT4 все еще содержат много ценной информации, даже если вы, вероятно, захотите что-то хотя бы для Windows 2000, из-за капитального ремонта системы PnP и многого другого в Windows 2000.

OSR также является отличным онлайн-ресурсом, хотя я должен вас предупредить: они продают курсы, и эти курсы превосходны. Естественно, они не будут предоставлять все подробности в доступных онлайн-ресурсах. Мне казалось, что я кое-что знаю о программировании драйверов, пока в 2005 году я не прошел два их курса. Они также содержат три списка рассылки.

Помимо разницы между выгружаемым и невыгружаемым пулом, вам нужно будет изучить такие концепции, как IRQL, и то, что вы можете делать на каком IRQL. Кроме того, большинство людей думают о драйверах как о «программах», что является еще одной ошибкой. Их можно больше сравнивать с DLL, хотя и у этого сравнения есть свои недостатки. Драйверам сложно поддерживать глобальное состояние, потому что многие потоки из различных процессов в единой системе обмена сообщениями и KM могут забивать его запросами. И все это по-прежнему должно работать с разумной скоростью. Вы также можете изучить такие инструменты, как WinDbg, хотя с новой интеграцией VS 11 WDK вам это может больше не понадобиться (VisualKD - более старый вариант для той же проблемы).

Если вы думаете, что вам удастся избежать проблем с программированием единой системы обмена сообщениями Windows в KM, подумайте еще раз! Наилучший сценарий, который я могу себе представить, - это то, что ваш драйвер будет плохо написан и будет работать только потому, что вы использовали одну из последних моделей драйверов из WDF, которая упрощает многие вещи, которые в противном случае требуют глубоких знаний. Однако будет ли он работать надежно? Вы должны учитывать, что сбой программы просто приводит к сбою программы, но ваш аварийный драйвер неизбежно приведет к сбою ОС, последствия которого могут стать очевидными только позже. Особенно если учесть, что ПК также используются в больницах или на атомных электростанциях.

И последнее замечание: как я уже отмечал ранее, вам вообще не нужна Visual Studio. Будь то экспресс-выпуск или другое. Причина в том, что WDK, как сообщается, является подмножеством среды, используемой для создания самой ОС (например, Windows). Это означает, что вы можете использовать Vim или любой другой любимый редактор и при этом создавать драйвер. В конце концов, среда сборки WDK основана на nmake, где вверху находится приложение с именем build, а файл sources в вашей папке является центральным файлом в процессе сборки. Посмотрите любой образец в WDK, их много. Но больше всего RTFM (читайте дружелюбный мануал). Документация WDK превосходна, особенно если у вас есть сравнение с Windows NT4, 2000 или даже XP.

person 0xC0000022L    schedule 15.05.2012