Драйверы режима ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем wasm_test, 14 ноя 2008.

  1. jerec

    jerec New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2010
    Сообщения:
    3
    Может кто подскажет как интегрировать DDK в VS 2005? В гуугле собственно такие вещи есть, например
    Однако пункт 3 осилить не могу. Точнее в настройках VS не могу найти место для подключения).
     
  2. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    jerec
    Tools->Options->Projects and Solutions->VC++ Directories->Show directories for
    Выбираете конкретный раздел, и добавляете нужные вам пути.
    Это один из вариантов.
    Можно же туда ничего не прописывать, а пути прописать в свойствах Компилятора и Линкера, в настройках проекта.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проще всего прописать в Tools/Options/..../VC++ Directories, но тогда придется при переносе проектов и студии для настроенной студии один раз сделать экспорт настроек (Tools -> Import and export settings), поставить галочку, чтобы она использовала их как "team settings" (типа одни на всех кодеров), что довольно геморройно. Зато в файле проекта не висят некрасивые пути к инклудам и либам.

    Либо можно не менять настроек студии, а все делать в настройках проекта. Это как-то более дзенно, будет компилироваться, куда бы ты не принес свой .vcproj/.sln с исходниками, но мне так не нравится - придется тогда пути задавать вида %WINDDK%\inc\crt и тп, нужна настройка переменных окружения. Опять же, что-то придется менять.

    Я лично предпочитаю вариант ничего не трогать в проекте (additional library paths/additional include paths), а выставлять всё один раз при установке студии в Tools/Options/.../VC++ Directories. Как-то красивее это
     
  4. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    А мне больше нравится более простой вариант - создавать в Студии makefile-проект и для сборки использовать ddkbuild (http://www.osronline.com/article.cfm?article=43), но, бесспорно, прописав все директории с инклюдами, дабы использовать всю мощь intellisense)
     
  5. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Скачивал отсюда VisualDDK, интегрируетс в VisualStudio и имеется возможность создать solution "как обычно" (http://www.brothersoft.com/publisher/sysprogs.html).
    Отладчик глючит, но для создания проектов мастером - вполне пригодная тулза. Хорошее начинание, жаль не развивается (вроди).
     
  6. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Добрый день. Возможно глупый вопрос, но что нужно читать перед Руссиновичем?
    Говоря яснее -- какие знания нужно иметь, чтобы начать заниматься разработкой драйверов?

    Я неплохо знаю С++(именно С++, а не С). На каком уровне нужно знать ассемблер? Стоит ли читать Руссиновича с _минимальными_ знаниями ассемблера?
    И что еще нужно знать?

    Зарание благодарен.
     
  7. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ядро также экспортирует _except_handler, с эксцепшнами вопросов быть не должно
     
  9. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    солдатов плохой перевод ддк
     
  10. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    sl0n
    +100500
    Поубивал бы всех, кто советует Солдатова.
    Это просто ппц. (извините, не выдержал)
    bug1z
    Вам Руссинович сайчас нафиг не нужен. А что читать, вам уже в хипе посоветовали. Солдатова выкиньте.
     
  11. C4sh

    C4sh New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    7
    А чeм солдaтов плох?
     
  12. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    C4sh
    надо переформулировать вопрос на "что там хорошего?"
    и по молчанию будет всё понятно( школьников не учитываем)
     
  13. C4sh

    C4sh New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    7
    нeт-нeт, вы нe подумaйтe, что я хочу что то докaзaть. Спросил тaк кaк нe читaл.
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    C4sh
    самое лучшее на русском это Уолтер Онни.
    полностью раскрывает тему и радует разными мелкими подробностями и нюансами
     
  15. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    TermoSINteZ, да, я уже определился. Всем спасибо за ответы.
     
  16. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Взял проект драйвера из статьи http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/
    студии 2008.
    вознили проблемки
    1. часть путей у меня в ddk по другому называется а не которых и нет.
    на пример (папки wxp в директории inc\ddk )
    в общем эту проблему решил немного изменив пути.
    2. При компиляции возникают ошибки:
    где искать эти функи ?...
     
  17. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    все оказалось проще простого))
    сменив в проекте :
    #define _WIN32_WINNT 0x0400 на #define _WIN32_WINNT 0x0500
    все собралось
     
  18. Artemprodigy

    Artemprodigy New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2010
    Сообщения:
    4
    Код (Text):
    1. #include "precomp.h"
    2. #include <initguid.h>
    3. #include <ntddser.h>
    4. #include "timeout.h"
    5. #include "delay.h"
    6. #include "bufutils.h"
    7. #include "strutils.h"
    8. #include "showport.h"
    9.  
    10. /*
    11.  * FILE_ID used by HALT_UNLESS to put it on BSOD
    12.  */
    13. #define FILE_ID 6
    14.  
    15. NTSTATUS InitCommonExt(
    16.     PC0C_COMMON_EXTENSION pDevExt,
    17.     IN PDEVICE_OBJECT pDevObj,
    18.     short doType,
    19.     PWCHAR pPortName)
    20. {
    21.   pDevExt->pDevObj = pDevObj;
    22.   pDevExt->doType = doType;
    23.   return CopyStrW(pDevExt->portName, sizeof(pDevExt->portName)/sizeof(pDevExt->portName[0]), pPortName);
    24. }
    25.  
    26. VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt)
    27. {
    28.   if (pDevExt->pIoPortLocal) {
    29.     FreeTimeouts(pDevExt->pIoPortLocal);
    30.     FreeWriteDelay(pDevExt->pIoPortLocal);
    31.     pDevExt->pIoPortLocal->plugInMode = FALSE;
    32.     pDevExt->pIoPortLocal->exclusiveMode = FALSE;
    33.     pDevExt->pIoPortLocal->pDevExt = NULL;
    34.     FreeTxBuffer(&pDevExt->pIoPortLocal->txBuf);
    35.     pDevExt->pIoPortLocal->brokeChars = 0;  /* reset on idle */
    36.   }
    37.  
    38.   if (!HidePort(pDevExt))
    39.     SysLog(pDevExt->pDevObj, STATUS_UNSUCCESSFUL, L"RemoveFdoPort HidePort FAIL");
    40.  
    41.   if (pDevExt->symbolicLinkName.Buffer)
    42.     RtlFreeUnicodeString(&pDevExt->symbolicLinkName);
    43.  
    44.   StrFree(&pDevExt->ntDeviceName);
    45.   StrFree(&pDevExt->win32DeviceName);
    46.  
    47.   if (pDevExt->pLowDevObj)
    48.     IoDetachDevice(pDevExt->pLowDevObj);
    49.  
    50.   Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemoveFdoPort");
    51.  
    52.   IoDeleteDevice(pDevExt->pDevObj);
    53. }
    54.  
    55. NTSTATUS AddFdoPort(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj)
    56. {
    57.   NTSTATUS status;
    58.   UNICODE_STRING portName;
    59.   PDEVICE_OBJECT pNewDevObj;
    60.   PC0C_FDOPORT_EXTENSION pDevExt;
    61.   PC0C_PDOPORT_EXTENSION pPhDevExt;
    62.   ULONG emuBR, emuOverrun, plugInMode, exclusiveMode, hiddenMode;
    63.   ULONG brokeCharsProbability;
    64.   ULONG addRTTO, addRITO;
    65.   ULONG pinCTS, pinDSR, pinDCD, pinRI;
    66.   UNICODE_STRING ntDeviceName;
    67.   PWCHAR pPortName;
    68.  
    69.   status = STATUS_SUCCESS;
    70.   pDevExt = NULL;
    71.   RtlInitUnicodeString(&portName, NULL);
    72.   RtlInitUnicodeString(&ntDeviceName, NULL);
    73.  
    74.   StrAppendDeviceProperty(&status, &ntDeviceName, pPhDevObj, DevicePropertyPhysicalDeviceObjectName);
    75.  
    76.   if (!NT_SUCCESS(status)) {
    77.     SysLog(pPhDevObj, status, L"AddFdoPort IoGetDeviceProperty FAIL");
    78.     goto clean;
    79.   }
    80.  
    81.   pPhDevExt = (PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension;
    82.  
    83.   if (!pPhDevExt || pPhDevExt->doType != C0C_DOTYPE_PP) {
    84.     status = STATUS_UNSUCCESSFUL;
    85.     SysLog(pPhDevObj, status, L"AddFdoPort FAIL. Type  of PDO is not PP");
    86.     goto clean;
    87.   }
    88.  
    89.   Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"AddFdoPort for ", ntDeviceName.Buffer);
    90.  
    91.   pPortName = pPhDevExt->portName;
    92.  
    93.   if (!*pPortName) {
    94.     status = STATUS_UNSUCCESSFUL;
    95.     SysLog(pPhDevObj, status, L"AddFdoPort FAIL. The PDO has invalid port name");
    96.     goto clean;
    97.   }
    98.  
    99.   {
    100.     UNICODE_STRING portRegistryPath;
    101.  
    102.     RtlInitUnicodeString(&portRegistryPath, NULL);
    103.     StrAppendStr(&status, &portRegistryPath, c0cGlobal.registryPath.Buffer, c0cGlobal.registryPath.Length);
    104.     StrAppendStr0(&status, &portRegistryPath, L"\\Parameters\\");
    105.     StrAppendStr0(&status, &portRegistryPath, pPortName);
    106.  
    107.     if (NT_SUCCESS(status)) {
    108.       WCHAR portNameBuf[C0C_PORT_NAME_LEN + 1];
    109.       UNICODE_STRING portNameTmp;
    110.       RTL_QUERY_REGISTRY_TABLE queryTable[2];
    111.  
    112.       RtlZeroMemory(queryTable, sizeof(queryTable));
    113.  
    114.       portNameTmp.Length = 0;
    115.       portNameTmp.MaximumLength = sizeof(portNameBuf);
    116.       portNameTmp.Buffer = portNameBuf;
    117.  
    118.       queryTable[0].Flags        = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
    119.       queryTable[0].Name         = L"PortName";
    120.       queryTable[0].EntryContext = &portNameTmp;
    121.  
    122.       status = RtlQueryRegistryValues(
    123.           RTL_REGISTRY_ABSOLUTE,
    124.           portRegistryPath.Buffer,
    125.           queryTable,
    126.           NULL,
    127.           NULL);
    128.  
    129.       if (!NT_SUCCESS(status) || !portNameTmp.Length) {
    130.         status = STATUS_SUCCESS;
    131.         StrAppendStr0(&status, &portName, pPortName);
    132.       } else {
    133.         StrAppendStr(&status, &portName, portNameTmp.Buffer, portNameTmp.Length);
    134.         Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"PortName set to ", portName.Buffer);
    135.       }
    136.     }
    137.  
    138.     emuBR = C0C_DEFAULT_EMUBR;
    139.     emuOverrun = C0C_DEFAULT_EMUOVERRUN;
    140.     plugInMode = C0C_DEFAULT_PLUGINMODE;
    141.     exclusiveMode = C0C_DEFAULT_EXCLUSIVEMODE;
    142.     hiddenMode = C0C_DEFAULT_HIDDENMODE;
    143.     pinCTS = C0C_DEFAULT_PIN_CTS;
    144.     pinDSR = C0C_DEFAULT_PIN_DSR;
    145.     pinDCD = C0C_DEFAULT_PIN_DCD;
    146.     pinRI = C0C_DEFAULT_PIN_RI;
    147.     brokeCharsProbability = C0C_DEFAULT_EMUNOISE;
    148.     addRTTO = C0C_DEFAULT_ADDRTTO;
    149.     addRITO = C0C_DEFAULT_ADDRITO;
    150.  
    151.     if (NT_SUCCESS(status)) {
    152.       RTL_QUERY_REGISTRY_TABLE queryTable[13];
    153.       int i;
    154.  
    155.       RtlZeroMemory(queryTable, sizeof(queryTable));
    156.  
    157.       for (i = 0 ; i < (sizeof(queryTable)/sizeof(queryTable[0]) - 1) ; i++) {
    158.         queryTable[i].Flags         = RTL_QUERY_REGISTRY_DIRECT;
    159.         queryTable[i].DefaultType   = REG_DWORD;
    160.         queryTable[i].DefaultLength = sizeof(ULONG);
    161.       }
    162.  
    163.       i = 0;
    164.       queryTable[i].Name          = L"EmuBR";
    165.       queryTable[i].EntryContext  = &emuBR;
    166.       queryTable[i].DefaultData   = &emuBR;
    167.  
    168.       i++;
    169.       queryTable[i].Name          = L"EmuOverrun";
    170.       queryTable[i].EntryContext  = &emuOverrun;
    171.       queryTable[i].DefaultData   = &emuOverrun;
    172.  
    173.       i++;
    174.       queryTable[i].Name          = L"PlugInMode";
    175.       queryTable[i].EntryContext  = &plugInMode;
    176.       queryTable[i].DefaultData   = &plugInMode;
    177.  
    178.       i++;
    179.       queryTable[i].Name          = L"ExclusiveMode";
    180.       queryTable[i].EntryContext  = &exclusiveMode;
    181.       queryTable[i].DefaultData   = &exclusiveMode;
    182.  
    183.       i++;
    184.       queryTable[i].Name          = L"HiddenMode";
    185.       queryTable[i].EntryContext  = &hiddenMode;
    186.       queryTable[i].DefaultData   = &hiddenMode;
    187.  
    188.       i++;
    189.       queryTable[i].Name          = L"cts";
    190.       queryTable[i].EntryContext  = &pinCTS;
    191.       queryTable[i].DefaultData   = &pinCTS;
    192.  
    193.       i++;
    194.       queryTable[i].Name          = L"dsr";
    195.       queryTable[i].EntryContext  = &pinDSR;
    196.       queryTable[i].DefaultData   = &pinDSR;
    197.  
    198.       i++;
    199.       queryTable[i].Name          = L"dcd";
    200.       queryTable[i].EntryContext  = &pinDCD;
    201.       queryTable[i].DefaultData   = &pinDCD;
    202.  
    203.       i++;
    204.       queryTable[i].Name          = L"ri";
    205.       queryTable[i].EntryContext  = &pinRI;
    206.       queryTable[i].DefaultData   = &pinRI;
    207.  
    208.       i++;
    209.       queryTable[i].Name          = L"EmuNoise";
    210.       queryTable[i].EntryContext  = &brokeCharsProbability;
    211.       queryTable[i].DefaultData   = &brokeCharsProbability;
    212.  
    213.       i++;
    214.       queryTable[i].Name          = L"AddRTTO";
    215.       queryTable[i].EntryContext  = &addRTTO;
    216.       queryTable[i].DefaultData   = &addRTTO;
    217.  
    218.       i++;
    219.       queryTable[i].Name          = L"AddRITO";
    220.       queryTable[i].EntryContext  = &addRITO;
    221.       queryTable[i].DefaultData   = &addRITO;
    222.  
    223.       RtlQueryRegistryValues(
    224.           RTL_REGISTRY_ABSOLUTE,
    225.           portRegistryPath.Buffer,
    226.           queryTable,
    227.           NULL,
    228.           NULL);
    229.     }
    230.  
    231.     StrFree(&portRegistryPath);
    232.   }
    233.  
    234.   if (!NT_SUCCESS(status)) {
    235.     SysLog(pPhDevObj, status, L"AddFdoPort FAIL");
    236.     goto clean;
    237.   }
    238.  
    239.   status = IoCreateDevice(pDrvObj,
    240.                           sizeof(*pDevExt),
    241.                           NULL,
    242.                           FILE_DEVICE_SERIAL_PORT,
    243.                           FILE_DEVICE_SECURE_OPEN,
    244.                           TRUE,
    245.                           &pNewDevObj);
    246.  
    247.   if (!NT_SUCCESS(status)) {
    248.     SysLog(pPhDevObj, status, L"AddFdoPort IoCreateDevice FAIL");
    249.     goto clean;
    250.   }
    251.  
    252.   HALT_UNLESS(pNewDevObj);
    253.   pDevExt = pNewDevObj->DeviceExtension;
    254.   HALT_UNLESS(pDevExt);
    255.   RtlZeroMemory(pDevExt, sizeof(*pDevExt));
    256.   pDevExt->pIoPortLocal = pPhDevExt->pIoPortLocal;
    257.   status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_FP, portName.Buffer);
    258.  
    259.   if (!NT_SUCCESS(status)) {
    260.     SysLog(pPhDevObj, status, L"AddFdoPort FAIL");
    261.     goto clean;
    262.   }
    263.  
    264.   pDevExt->pIoPortLocal->pDevExt = pDevExt;
    265.  
    266.   if (emuBR) {
    267.     if (NT_SUCCESS(AllocWriteDelay(pDevExt->pIoPortLocal)))
    268.       Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation");
    269.     else
    270.       SysLog(pPhDevObj, status, L"AddFdoPort AllocWriteDelay FAIL");
    271.   } else {
    272.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled baudrate emulation");
    273.   }
    274.  
    275.   if (emuOverrun) {
    276.     pDevExt->pIoPortLocal->emuOverrun = TRUE;
    277.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled overrun emulation");
    278.   } else {
    279.     pDevExt->pIoPortLocal->emuOverrun = FALSE;
    280.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled overrun emulation");
    281.   }
    282.  
    283.   if (plugInMode) {
    284.     pDevExt->pIoPortLocal->plugInMode = TRUE;
    285.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled plug-in mode");
    286.   } else {
    287.     pDevExt->pIoPortLocal->plugInMode = FALSE;
    288.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled plug-in mode");
    289.   }
    290.  
    291.   if (exclusiveMode) {
    292.     pDevExt->pIoPortLocal->exclusiveMode = TRUE;
    293.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled exclusive mode");
    294.   } else {
    295.     pDevExt->pIoPortLocal->exclusiveMode = FALSE;
    296.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled exclusive mode");
    297.   }
    298.  
    299.   SetHiddenMode(pDevExt, hiddenMode);
    300.  
    301.   pDevExt->pIoPortLocal->addRTTO = addRTTO;
    302.  
    303. #if ENABLE_TRACING
    304.   if (addRTTO)
    305.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled ReadTotalTimeoutConstant increase");
    306. #endif /* ENABLE_TRACING */
    307.  
    308.   pDevExt->pIoPortLocal->addRITO = addRITO;
    309.  
    310. #if ENABLE_TRACING
    311.   if (addRITO)
    312.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled ReadIntervalTimeout increase");
    313. #endif /* ENABLE_TRACING */
    314.  
    315.   AllocTimeouts(pDevExt->pIoPortLocal);
    316.  
    317.   RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars));
    318.   pDevExt->pIoPortLocal->specialChars.XonChar      = 0x11;
    319.   pDevExt->pIoPortLocal->specialChars.XoffChar     = 0x13;
    320.  
    321.   RtlZeroMemory(&pDevExt->pIoPortLocal->handFlow, sizeof(pDevExt->pIoPortLocal->handFlow));
    322.   pDevExt->pIoPortLocal->handFlow.ControlHandShake = SERIAL_DTR_CONTROL;
    323.   pDevExt->pIoPortLocal->handFlow.FlowReplace      = SERIAL_RTS_CONTROL;
    324.  
    325.   pDevExt->pIoPortLocal->lineControl.WordLength    = 7;
    326.   pDevExt->pIoPortLocal->lineControl.Parity        = EVEN_PARITY;
    327.   pDevExt->pIoPortLocal->lineControl.StopBits      = STOP_BIT_1;
    328.   pDevExt->pIoPortLocal->baudRate.BaudRate         = 1200;
    329.  
    330.   SetWriteDelay(pDevExt->pIoPortLocal);
    331.  
    332.   SetTxBuffer(&pDevExt->pIoPortLocal->txBuf, 1, TRUE);
    333.  
    334.   pDevExt->pIoPortLocal->modemControl |= C0C_MCR_OUT2;
    335.  
    336.   PinMap(pDevExt->pIoPortLocal, pinCTS, pinDSR, pinDCD, pinRI);
    337.  
    338.   pDevExt->pIoPortLocal->brokeCharsProbability = brokeCharsProbability;
    339.  
    340. #if ENABLE_TRACING
    341.   if (brokeCharsProbability)
    342.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled noise emulation");
    343.   else
    344.     Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled noise emulation");
    345. #endif /* ENABLE_TRACING */
    346.  
    347.   pDevExt->pLowDevObj = IoAttachDeviceToDeviceStack(pNewDevObj, pPhDevObj);
    348.  
    349.   if (!pDevExt->pLowDevObj) {
    350.     status = STATUS_NO_SUCH_DEVICE;
    351.     SysLog(pPhDevObj, status, L"AddFdoPort IoAttachDeviceToDeviceStack FAIL");
    352.     goto clean;
    353.   }
    354.  
    355.   pNewDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
    356.   pNewDevObj->Flags |= DO_BUFFERED_IO;
    357.  
    358.   /* Create symbolic links to device */
    359.  
    360.   RtlInitUnicodeString(&pDevExt->ntDeviceName, NULL);
    361.   StrAppendStr0(&status, &pDevExt->ntDeviceName, ntDeviceName.Buffer);
    362.  
    363.   RtlInitUnicodeString(&pDevExt->win32DeviceName, NULL);
    364.   StrAppendStr0(&status, &pDevExt->win32DeviceName, C0C_PREF_WIN32_DEVICE_NAME);
    365.   StrAppendStr0(&status, &pDevExt->win32DeviceName, portName.Buffer);
    366.  
    367.   if (!NT_SUCCESS(status)) {
    368.     StrFree(&pDevExt->win32DeviceName);
    369.     StrFree(&pDevExt->ntDeviceName);
    370.  
    371.     SysLog(pPhDevObj, status, L"AddFdoPort StrAppendStr0 FAIL");
    372.   }
    373.  
    374.   status = IoRegisterDeviceInterface(pPhDevObj,
    375.                                      (LPGUID)&GUID_CLASS_COMPORT,
    376.                                      NULL,
    377.                                      &pDevExt->symbolicLinkName);
    378.  
    379.   if (!NT_SUCCESS(status)) {
    380.     SysLog(pPhDevObj, status, L"AddFdoPort IoRegisterDeviceInterface FAIL");
    381.     pDevExt->symbolicLinkName.Buffer = NULL;
    382.   }
    383.  
    384.   if (!pDevExt->pIoPortLocal->plugInMode || pDevExt->pIoPortLocal->pIoPortRemote->isOpen) {
    385.     if (!ShowPort(pDevExt))
    386.       SysLog(pDevExt->pDevObj, STATUS_UNSUCCESSFUL, L"AddFdoPort ShowPort FAIL");
    387.   } else {
    388.     HidePortName(pDevExt);
    389.   }
    390.  
    391.   status = STATUS_SUCCESS;
    392.  
    393.   Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddFdoPort OK");
    394.  
    395. clean:
    396.  
    397.   if (!NT_SUCCESS(status) && pDevExt)
    398.     RemoveFdoPort(pDevExt);
    399.  
    400.   StrFree(&ntDeviceName);
    401.   StrFree(&portName);
    402.  
    403.   return status;
    404. }
    405.  
    406. VOID RemovePdoPort(IN PC0C_PDOPORT_EXTENSION pDevExt)
    407. {
    408.   Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemovePdoPort");
    409.  
    410.   IoDeleteDevice(pDevExt->pDevObj);
    411. }
    412.  
    413. NTSTATUS AddPdoPort(
    414.     IN PDRIVER_OBJECT pDrvObj,
    415.     IN ULONG num,
    416.     IN BOOLEAN isA,
    417.     IN PC0C_FDOBUS_EXTENSION pBusExt,
    418.     IN PC0C_IO_PORT pIoPortLocal,
    419.     OUT PC0C_PDOPORT_EXTENSION *ppDevExt)
    420. {
    421.   NTSTATUS status;
    422.   UNICODE_STRING portName;
    423.   PDEVICE_OBJECT pNewDevObj;
    424.   UNICODE_STRING ntDeviceName;
    425.   PC0C_PDOPORT_EXTENSION pDevExt = NULL;
    426.  
    427.   status = STATUS_SUCCESS;
    428.  
    429.   RtlInitUnicodeString(&portName, NULL);
    430.   StrAppendStr0(&status, &portName, isA ? C0C_PREF_PORT_NAME_A : C0C_PREF_PORT_NAME_B);
    431.   StrAppendNum(&status, &portName, num, 10);
    432.  
    433.   RtlInitUnicodeString(&ntDeviceName, NULL);
    434.   StrAppendStr0(&status, &ntDeviceName, isA ? C0C_PREF_DEVICE_NAME_A : C0C_PREF_DEVICE_NAME_B);
    435.   StrAppendNum(&status, &ntDeviceName, num, 10);
    436.  
    437.   if (!NT_SUCCESS(status)) {
    438.     SysLog(pBusExt->pDevObj, status, L"AddPdoPort FAIL");
    439.     goto clean;
    440.   }
    441.  
    442.   status = IoCreateDevice(pDrvObj,
    443.                           sizeof(*pDevExt),
    444.                           &ntDeviceName,
    445.                           FILE_DEVICE_SERIAL_PORT,
    446.                           FILE_DEVICE_SECURE_OPEN,
    447.                           TRUE,
    448.                           &pNewDevObj);
    449.  
    450.   if (!NT_SUCCESS(status)) {
    451.     SysLog(pBusExt->pDevObj, status, L"AddPdoPort IoCreateDevice FAIL");
    452.     goto clean;
    453.   }
    454.  
    455.   HALT_UNLESS(pNewDevObj);
    456.   pIoPortLocal->pPhDevObj = pNewDevObj;
    457.   pDevExt = (pNewDevObj)->DeviceExtension;
    458.   HALT_UNLESS(pDevExt);
    459.   RtlZeroMemory(pDevExt, sizeof(*pDevExt));
    460.   status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_PP, portName.Buffer);
    461.  
    462.   if (!NT_SUCCESS(status)) {
    463.     SysLog(pBusExt->pDevObj, status, L"AddPdoPort FAIL");
    464.     goto clean;
    465.   }
    466.  
    467.   pDevExt->pBusExt = pBusExt;
    468.   pDevExt->pIoPortLocal = pIoPortLocal;
    469.  
    470.   Trace00((PC0C_COMMON_EXTENSION)pDevExt, L"AddPdoPort OK - ", ntDeviceName.Buffer);
    471.  
    472. clean:
    473.  
    474.   if (!NT_SUCCESS(status) && pDevExt) {
    475.     RemovePdoPort(pDevExt);
    476.     pDevExt = NULL;
    477.   }
    478.  
    479.   StrFree(&ntDeviceName);
    480.   StrFree(&portName);
    481.  
    482.   *ppDevExt = pDevExt;
    483.  
    484.   return status;
    485. }
    486.  
    487. VOID RemoveFdoBus(IN PC0C_FDOBUS_EXTENSION pDevExt)
    488. {
    489.   int i;
    490.  
    491.   for (i = 0 ; i < 2 ; i++) {
    492.     if (pDevExt->childs[i].pDevExt)
    493.       RemovePdoPort(pDevExt->childs[i].pDevExt);
    494.   }
    495.  
    496.   if (pDevExt->pLowDevObj)
    497.     IoDetachDevice(pDevExt->pLowDevObj);
    498.  
    499.   Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemoveFdoBus");
    500.  
    501.   IoDeleteDevice(pDevExt->pDevObj);
    502. }
    503.  
    504. ULONG AllocPortNum(IN PDRIVER_OBJECT pDrvObj, ULONG num)
    505. {
    506.   PDEVICE_OBJECT pDevObj;
    507.   ULONG numNext;
    508.   PCHAR pBusyMask;
    509.   SIZE_T busyMaskLen;
    510.   ULONG maskNum;
    511.   ULONG mask;
    512.  
    513.   numNext = 0;
    514.  
    515.   for (pDevObj = pDrvObj->DeviceObject ; pDevObj ; pDevObj = pDevObj->NextDevice) {
    516.     PC0C_FDOBUS_EXTENSION pDevExt = (PC0C_FDOBUS_EXTENSION)pDevObj->DeviceExtension;
    517.  
    518.     if (pDevExt && pDevExt->doType == C0C_DOTYPE_FB) {
    519.       ULONG portNum = pDevExt->portNum;
    520.  
    521.       if (portNum >= numNext)
    522.         numNext = portNum + 1;
    523.     }
    524.   }
    525.  
    526.   if (num == (ULONG)-1)
    527.     num = 0;
    528.  
    529.   if (num >= numNext)
    530.     return num;
    531.  
    532.   busyMaskLen = (numNext + (sizeof(*pBusyMask)*8 - 1))/(sizeof(*pBusyMask)*8);
    533.  
    534.   pBusyMask = C0C_ALLOCATE_POOL(PagedPool, busyMaskLen);
    535.  
    536.   if (!pBusyMask) {
    537.     SysLog(pDrvObj, STATUS_INSUFFICIENT_RESOURCES, L"AllocPortNum C0C_ALLOCATE_POOL FAIL");
    538.     return numNext;
    539.   }
    540.  
    541.   RtlZeroMemory(pBusyMask, busyMaskLen);
    542.  
    543.   for (pDevObj = pDrvObj->DeviceObject ; pDevObj ; pDevObj = pDevObj->NextDevice) {
    544.     PC0C_FDOBUS_EXTENSION pDevExt = (PC0C_FDOBUS_EXTENSION)pDevObj->DeviceExtension;
    545.  
    546.     if (pDevExt && pDevExt->doType == C0C_DOTYPE_FB) {
    547.       ULONG portNum = pDevExt->portNum;
    548.  
    549.       maskNum = portNum/(sizeof(*pBusyMask)*8);
    550.       mask = 1 << (portNum%(sizeof(*pBusyMask)*8));
    551.  
    552.       HALT_UNLESS3(maskNum < busyMaskLen, portNum, busyMaskLen, numNext);
    553.       pBusyMask[maskNum] |= mask;
    554.     }
    555.   }
    556.  
    557.   maskNum = num/(sizeof(*pBusyMask)*8);
    558.   mask = 1 << (num%(sizeof(*pBusyMask)*8));
    559.  
    560.   if ((pBusyMask[maskNum] & mask) != 0) {
    561.     for (num = 0 ; num < numNext ; num++) {
    562.       maskNum = num/(sizeof(*pBusyMask)*8);
    563.       mask = 1 << (num%(sizeof(*pBusyMask)*8));
    564.  
    565.       HALT_UNLESS3(maskNum < busyMaskLen, num, busyMaskLen, numNext);
    566.       if ((pBusyMask[maskNum] & mask) == 0)
    567.         break;
    568.     }
    569.   }
    570.  
    571.   C0C_FREE_POOL(pBusyMask);
    572.  
    573.   return num;
    574. }
    575.  
    576. ULONG GetPortNum(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj)
    577. {
    578.   ULONG num;
    579.   ULONG numPref;
    580.   HANDLE hKey;
    581.   NTSTATUS status;
    582.  
    583.   numPref = (ULONG)-1;
    584.  
    585.   status = IoOpenDeviceRegistryKey(pPhDevObj,
    586.                                    PLUGPLAY_REGKEY_DEVICE,
    587.                                    STANDARD_RIGHTS_READ,
    588.                                    &hKey);
    589.  
    590.   if (status == STATUS_SUCCESS) {
    591.     UNICODE_STRING keyName;
    592.     PKEY_VALUE_PARTIAL_INFORMATION pInfo;
    593.     ULONG len;
    594.  
    595.     RtlInitUnicodeString(&keyName, C0C_REGSTR_VAL_PORT_NUM);
    596.  
    597.     len = sizeof(KEY_VALUE_FULL_INFORMATION) + sizeof(ULONG);
    598.  
    599.     pInfo = C0C_ALLOCATE_POOL(PagedPool, len);
    600.  
    601.     if (pInfo) {
    602.       status = ZwQueryValueKey(hKey, &keyName, KeyValuePartialInformation, pInfo, len, &len);
    603.  
    604.       if (NT_SUCCESS(status) && pInfo->DataLength == sizeof(ULONG))
    605.         numPref = *(PULONG)pInfo->Data;
    606.  
    607.       C0C_FREE_POOL(pInfo);
    608.     }
    609.  
    610.     if (numPref == (ULONG)-1)
    611.       num = AllocPortNum(pDrvObj, numPref);
    612.     else
    613.       num = numPref;
    614.  
    615.     if (num != numPref) {
    616.       status = ZwSetValueKey(hKey, &keyName, 0, REG_DWORD, &num, sizeof(num));
    617.  
    618.       if (!NT_SUCCESS(status))
    619.         SysLog(pPhDevObj, status, L"ZwSetValueKey(PortName) FAIL");
    620.     }
    621.  
    622.     ZwClose(hKey);
    623.   } else {
    624.     SysLog(pPhDevObj, status, L"GetPortNum IoOpenDeviceRegistryKey(PLUGPLAY_REGKEY_DEVICE) FAIL");
    625.  
    626.     num = AllocPortNum(pDrvObj, numPref);
    627.   }
    628.  
    629.   return num;
    630. }
    631.  
    632. NTSTATUS AddFdoBus(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj)
    633. {
    634.   NTSTATUS status = STATUS_SUCCESS;
    635.   UNICODE_STRING portName;
    636.   UNICODE_STRING ntDeviceName;
    637.   PDEVICE_OBJECT pNewDevObj;
    638.   PC0C_FDOBUS_EXTENSION pDevExt = NULL;
    639.   ULONG num;
    640.   int i;
    641.  
    642.   num = GetPortNum(pDrvObj, pPhDevObj);
    643.  
    644.   RtlInitUnicodeString(&portName, NULL);
    645.   StrAppendStr0(&status, &portName, C0C_PREF_BUS_NAME);
    646.   StrAppendNum(&status, &portName, num, 10);
    647.  
    648.   RtlInitUnicodeString(&ntDeviceName, NULL);
    649.   StrAppendStr0(&status, &ntDeviceName, C0C_PREF_NT_DEVICE_NAME);
    650.   StrAppendStr(&status, &ntDeviceName, portName.Buffer, portName.Length);
    651.  
    652.   if (!NT_SUCCESS(status)) {
    653.     SysLog(pDrvObj, status, L"AddFdoBus FAIL");
    654.     goto clean;
    655.   }
    656.  
    657.   status = IoCreateDevice(pDrvObj,
    658.                           sizeof(*pDevExt),
    659.                           &ntDeviceName,
    660.                           FILE_DEVICE_BUS_EXTENDER,
    661.                           0,
    662.                           TRUE,
    663.                           &pNewDevObj);
    664.  
    665.   if (!NT_SUCCESS(status)) {
    666.     SysLog(pDrvObj, status, L"AddFdoBus IoCreateDevice FAIL");
    667.     goto clean;
    668.   }
    669.  
    670.   HALT_UNLESS(pNewDevObj);
    671.   pDevExt = pNewDevObj->DeviceExtension;
    672.   HALT_UNLESS(pDevExt);
    673.   RtlZeroMemory(pDevExt, sizeof(*pDevExt));
    674.   status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_FB, portName.Buffer);
    675.  
    676.   if (!NT_SUCCESS(status)) {
    677.     SysLog(pDrvObj, status, L"AddFdoBus InitCommonExt FAIL");
    678.     goto clean;
    679.   }
    680.  
    681.   pDevExt->portNum = num;
    682.   pDevExt->pLowDevObj = IoAttachDeviceToDeviceStack(pNewDevObj, pPhDevObj);
    683.  
    684.   if (!pDevExt->pLowDevObj) {
    685.     status = STATUS_NO_SUCH_DEVICE;
    686.     SysLog(pNewDevObj, status, L"AddFdoBus IoAttachDeviceToDeviceStack FAIL");
    687.     goto clean;
    688.   }
    689.  
    690.   pNewDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
    691.   KeInitializeSpinLock(&pDevExt->ioLock);
    692.  
    693.   for (i = 0 ; i < 2 ; i++) {
    694.     PC0C_IO_PORT pIoPort;
    695.     int j;
    696.  
    697.     pIoPort = &pDevExt->childs[i].ioPort;
    698.  
    699.     pIoPort->pIoLock = &pDevExt->ioLock;
    700.  
    701.     for (j = 0 ; j < C0C_QUEUE_SIZE ; j++) {
    702.       InitializeListHead(&pIoPort->irpQueues[j].queue);
    703.       pIoPort->irpQueues[j].pCurrent = NULL;
    704. #if DBG
    705.       pIoPort->irpQueues[j].started = FALSE;
    706. #endif /* DBG */
    707.     }
    708.  
    709.     pIoPort->pIoPortRemote = &pDevExt->childs[(i + 1) % 2].ioPort;
    710.  
    711.     status = AddPdoPort(pDrvObj,
    712.                         num,
    713.                         (BOOLEAN)(i ? FALSE : TRUE),
    714.                         pDevExt,
    715.                         pIoPort,
    716.                         &pDevExt->childs[i].pDevExt);
    717.  
    718.     if (!NT_SUCCESS(status)) {
    719.       SysLog(pNewDevObj, status, L"AddFdoBus AddPdoPort FAIL");
    720.       pDevExt->childs[i].pDevExt = NULL;
    721.       goto clean;
    722.     }
    723.   }
    724.  
    725.   Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddFdoBus OK");
    726.  
    727. clean:
    728.  
    729.   if (!NT_SUCCESS(status) && pDevExt)
    730.     RemoveFdoBus(pDevExt);
    731.  
    732.   StrFree(&ntDeviceName);
    733.   StrFree(&portName);
    734.  
    735.   return status;
    736. }
    737.  
    738. NTSTATUS c0cAddDevice(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj)
    739. {
    740.   NTSTATUS status;
    741.   UNICODE_STRING property;
    742.  
    743.   status = STATUS_SUCCESS;
    744.   RtlInitUnicodeString(&property, NULL);
    745.  
    746.   StrAppendDeviceProperty(&status, &property, pPhDevObj, DevicePropertyHardwareID);
    747.  
    748.   if (NT_SUCCESS(status))
    749.     Trace00(NULL, L"c0cAddDevice for ", property.Buffer);
    750.   else {
    751.     SysLog(pDrvObj, status, L"c0cAddDevice IoGetDeviceProperty FAIL");
    752.     return status;
    753.   }
    754.  
    755.   if (!_wcsicmp(C0C_PORT_DEVICE_ID, property.Buffer)) {
    756.     StrFree(&property);
    757.     status = AddFdoPort(pDrvObj, pPhDevObj);
    758.   }
    759.   else
    760.   if (!_wcsicmp(C0C_BUS_DEVICE_ID, property.Buffer)) {
    761.     StrFree(&property);
    762.     status = AddFdoBus(pDrvObj, pPhDevObj);
    763.   }
    764.   else {
    765.     StrFree(&property);
    766.     status = STATUS_UNSUCCESSFUL;
    767.     SysLog(pDrvObj, status, L"c0cAddDevice unknown HardwareID");
    768.   }
    769.  
    770.   return status;
    771. }
    Тут есть люди, которые делали драйвер виртуального КОМ порта? Если кто-то в курсе, то у меня есть несколько вопросов по этому коду...
     
  19. Artemprodigy

    Artemprodigy New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2010
    Сообщения:
    4
    Кто знает или где можно почитать такую вещь:
    Как именно образуется пара, как один порт понимает кто его пара??? И почему при создании пары создаётся аж 5 устройств?
     
  20. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Обращаюсь за помощью, совсем отчаился(
    Прочитал довольно много литературы о программировании драйверов, но как дошло до практики, остановился на первой ступеньке.

    Никак не получается собрать готовый .sys файл. Последний день полность потратил на поиск решений в интернете. Нашел очень много всего, вот пара ссылок:
    http://habrahabr.ru/blogs/system_programming/40466/
    http://storinka.com.ua/komplirovanie...l-studio-2008/
    и были многие другие... но ни одним способом откомпилить драйвер не получилось. Все время или появляются странные ошибки.. а если странных ошибок нет, то ошибки в самих DDK библиотеках.
    Вот пример : код взят отсюда http://habrahabr.ru/blogs/system_programming/40466/
    C:\WINDDK\2600>cd C:\new

    C:\new>build
    BUILD: Object root set to: ==> objchk
    BUILD: Adding /Y to COPYCMD so xcopy ops won't hang.
    BUILD: /i switch ignored
    BUILD: Using 2 child processes
    BUILD: Compile and Link for i386
    BUILD: Loading C:\WINDDK\2600\build.dat...
    BUILD: Computing Include file dependencies:
    BUILD: Examining c:\new directory for files to compile.
    c:\new - 1 source files (20 lines)
    BUILD: Compiling c:\new directory
    1>Compiling - testdriver.c for i386
    1>testdriver.c(13) : error C2018: unknown character '0xab'; unicode identifiers
    are not supported
    1>testdriver.c(13) : error C2065: 'Hello' : undeclared identifier
    1>testdriver.c(13) : error C4047: 'function' : 'PCH' differs in levels of indire
    ction from 'int'
    1>testdriver.c(13) : error C2146: syntax error : missing ')' before identifier '
    world'
    1>testdriver.c(13) : error C2144: syntax error : '<Unknown>' should be preceded
    by '<Unknown>'
    1>testdriver.c(13) : error C2144: syntax error : '<Unknown>' should be preceded
    by '<Unknown>'
    1>testdriver.c(13) : error C2143: syntax error : missing ')' before 'identifier'

    1>testdriver.c(13) : error C2017: illegal escape sequence
    1>testdriver.c(13) : error C2018: unknown character '0xbb'; unicode identifiers
    are not supported
    1>testdriver.c(13) : error C2059: syntax error : ')'
    1>testdriver.c(20) : error C2018: unknown character '0xab'; unicode identifiers
    are not supported
    1>testdriver.c(20) : error C2065: 'Goodbye' : undeclared identifier
    1>testdriver.c(20) : error C4047: 'function' : 'PCH' differs in levels of indire
    ction from 'int'
    1>testdriver.c(20) : error C2143: syntax error : missing ')' before '!'
    1>testdriver.c(20) : error C2017: illegal escape sequence
    1>testdriver.c(20) : error C2018: unknown character '0xbb'; unicode identifiers
    are not supported
    1>testdriver.c(20) : error C2059: syntax error : ')'
    BUILD: Compile errors: not linking c:\new directory
    BUILD: Done

    2 files compiled - 17 Errors

    Я качал различные версии DDK с разных сайтов.. итог один и тот же.
    Я кто-то сталкивался с подобным - помогите пожалуйста. ((
    Я до этого тока учебные драйверы на асме компилил, и там никаких проблем не было.