Вопрос по Kernel Mode: Создание нового порта

Тема в разделе "WASM.WIN32", создана пользователем Bill_TPOC, 19 апр 2005.

  1. Bill_TPOC

    Bill_TPOC New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2005
    Сообщения:
    31
    Здраствуйте!

    Вопрос: Как создать в системе новый COM-порт? COM-порт должен создаваться из драйвера. Т.е. задача заключается в создании драйвера устройства, который создает COM-порт в своей процедуре DriverEntry. Если пользовательское устройство записывает данные по этому порту, то в зависимости от этих данных что-то происходит. Т.е. драйвер работает от сообщений поступаемых на COM-порт. Например, посылаем команду KILL на этот COM-порт, а дровина убивает например какое-нибудь приложение.



    ---------------------------------------------------------

    По моим предположениям это будет драйвер фильтр для serial.sys драйвера. Но как это сделать или может концепция совсем другая.

    ---------------------------------------------------------

    Вопрос для Four-F, т.к. он специалист по драйверам. Но если ктонибудь знает ответ на этот вопрос помогите пожалуйста.
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Bill_TPOC, о каком порте речь идёт?

    Может быть ты имел в виду виртуальное устройство?

    Если пользовательское устройство записывает данные по этому порту если и меются в виду порты ввода-вывода(in/out) то писать в них так просто из r-3 нельзя.

    Создать порт ввода-вывода(не виртуальный) можно разве-что паяльником...

    Может опишешь ситуацию по конкретней?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Поиск по форуму, про создание виртуального СОМ-порта спрашивали не раз
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Bill_TPOC

    чёт я не понял Идешь в ддк, берешь готовый исходник драйвера, меняешь начинку и наслаждаешься... чего тут сложного, кроме того примеров на сайте было насколько я помню и ответов до 屁股 .....
     
  5. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    кароче ....до чё(па китайски).
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,

    IN PUNICODE_STRING RegistryPath)

    {

    NTSTATUS st;

    PCWSTR dDeviceName = L"\\Device\\VirtualCom";

    PCWSTR dSymbolicLinkName = L"\\DosDevices\\COM3";

    PDRIVER_DISPATCH *ppdd;



    RtlInitUnicodeString(&DeviceName, dDeviceName);

    RtlInitUnicodeString(&SymbolicLinkName, dSymbolicLinkName);



    st = IoCreateDevice(DriverObject, // указатель на DriverObject

    256, // максимальный размер принимаемых данных

    &DeviceName, // имя создаваемого устройства

    FILE_DEVICE_NULL,// тип создаваемого устройства

    METHOD_NEITHER, // метод буфферизации

    FALSE, // "эксклюзивное" устройство

    &deviceObject); // указатель на обьект устройства





    if (st == STATUS_SUCCESS)

    st = IoCreateSymbolicLink(&SymbolicLinkName, // имя создаваемой символической ссылки

    &DeviceName); // имя устройства



    ppdd = DriverObject->MajorFunction;



    // обьявляю процедуры обработки ввода-вывода

    ppdd [IRP_MJ_CREATE] =

    ppdd [IRP_MJ_WRITE ] = DriverDispatcher;



    DriverObject->DriverUnload = DriverUnload;



    return st;

    }
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Короче, надо создать устройство, и ассоциировать с ним символическую ссылку COM3, назначить процедуры обработки IRP и будет работать.

    Ну а чтоб в перечислении портов был еще и виртуальный порт, надо его в системе зарегистрировать (вроде в ддк на эту тему были примеры).
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  9. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    создание символик линка - это еще не всё...

    данные о порте надо прописать в реджистри HKLM\Hardware\DEVICEMAP\SERIALCOMM



    вот код ф-ии, создающей виртуальный сериальный порт:


    Код (Text):
    1. ULONG Card_CreateSerialPort(PDEVICE_OBJECT fdo)
    2. {
    3.   NTSTATUS status = STATUS_SUCCESS;
    4.   UNICODE_STRING    ComNameStr, ComNameStr1, ComNumStr;
    5.   OBJECT_ATTRIBUTES  objectAttributes;
    6.   HANDLE        hKeySection;
    7.    
    8.   DEVICE_EXTENSION *ext = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    9.  
    10.   WCHAR wszComName[100] = L"COM";
    11.   WCHAR wszComName1[100] = L"\\\\.\\COM";
    12.   static WCHAR wszSymName[100] = L"\\DosDevices\\";
    13.    
    14.   // make COM name
    15.   swprintf(wszComName, L"COM%i", ext->ComXSer.Number);
    16.   swprintf(wszComName1, L"\\??\\COM%i", ext->ComXSer.Number);
    17.   // make symbolic name
    18.   swprintf(wszSymName, L"\\DosDevices\\%s", wszComName);
    19.  
    20.   // Initislaize the unicode strings
    21.   RtlInitUnicodeString(&ComNameStr, wszComName);
    22.   RtlInitUnicodeString(&ComNameStr1, wszComName1);
    23.   RtlInitUnicodeString(&ext->ComXSer.ComSymbLink, wszSymName);
    24.  
    25.   // Is this COM port exist?
    26.   PFILE_OBJECT FileObject;
    27.   PDEVICE_OBJECT DeviceObject;
    28.   status = IoGetDeviceObjectPointer(&ComNameStr1, FILE_ALL_ACCESS, &FileObject, &DeviceObject );
    29.  
    30.   if (NT_SUCCESS(status))
    31.   {
    32.     ObDereferenceObject(FileObject);
    33.     ext->lastError = Err_CreateSerialPort;
    34.     return ext->lastError;
    35.   }
    36.  
    37.   status = IoCreateSymbolicLink(&ext->ComXSer.ComSymbLink, &g_nameString);
    38.  
    39.   if (!NT_SUCCESS(status))
    40.   {            
    41.     ext->lastError = Err_CreateSerialPort;
    42.     return ext->lastError;
    43.   }    
    44.  
    45.   // write SERIALCOM\\xxx registry key
    46.   status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, L"SERIALCOMM",
    47.     g_nameString.Buffer, REG_SZ, ComNameStr.Buffer,  ComNameStr.Length + sizeof(WCHAR));
    48.  
    49.   if(NT_SUCCESS(status))
    50.   {
    51.     ext->ComXSer.isEnabled = TRUE;
    52.   }
    53.   else
    54.   {
    55.     ext->lastError = Err_CreateSerialPort;
    56.   }
    57.  
    58.   return ext->lastError;
    59. }
     
  10. Bill_TPOC

    Bill_TPOC New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2005
    Сообщения:
    31
    Огромное спасибо за помощь. Но вот продолжение - если я создал COM-порт, то как мне связать его с модемом. Т.е. как заставить программы типа HyperTerminal посылать команды на данный COM-порт. Например, программа посылает команду ATDT 12346789, адровина смотрит на эту команду и убивает процесс вызовом ZwTerminateProcess. С Kernel Mode второй день, так что не смейтесь.
     
  11. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Bill_TPOC

    так и посылать :))