Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IRP_MJ_CREATE_NAMED_PIPE  (Прочитано 15508 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« : 13-08-2004 10:58 » 

Объясните пожалуйста для чего используется САБЖ.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
mad
Гость
« Ответ #1 : 13-08-2004 11:37 » 

Этот Pnp используется для обработки создания пайпа CreatePipe CreateNamedPipe ядром.(Чисто теоретически можно перехватывать и обрабатываь это сообщение, только надо знать куда вставать фильтром или каким то образом зарегстрировать драйвер, что бы ядро это сообщение отправляло в драйвер.) И не приходит в обычные wdm драйвера, как например, запросы MJ_QUERY_VOLUME_INFORMATION, которые обрабатываются только fs фильтрами или драйверами fs без специальных мер, как я уже сказал.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #2 : 13-08-2004 11:50 » 

Цитата: mad
И не приходит в обычные wdm драйвера, как например, запросы MJ_QUERY_VOLUME_INFORMATION, которые обрабатываются только fs фильтрами или драйверами fs без специальных мер, как я уже сказал.

mad, сорри, но я опять чего то недопонял. У меня есть исходник wdm драйвера в котором используется это. Вот функция :
Код:
NTSTATUS test3CreateNamedPipeDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
    NTSTATUS                        status;
    PTEST3_DEVICE_EXTENSION    deviceExtension;

    test3DebugPrint(DBG_GENERAL, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    deviceExtension = (PTEST3_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

    if (!test3AcquireRemoveLock(deviceExtension))
    {
        status = STATUS_NO_SUCH_DEVICE;

        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        test3DebugPrint(DBG_GENERAL, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

        return status;
    }

    status = STATUS_NOT_IMPLEMENTED;

    Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    test3ReleaseRemoveLock(deviceExtension);

    test3DebugPrint(DBG_GENERAL, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

И я не врубаюсь для чего она в исходнике  :oops:
« Последнее редактирование: 30-11-2007 22:19 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
mad
Гость
« Ответ #3 : 13-08-2004 15:40 » 

Я еще не видел, где бы обрабатывались IRP с такими MJ, можешь дать entry посмотреть? И откуда ты это взял? Что за test3?
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 14-08-2004 12:36 » 

test3, это название. После компиляции получится test3.sys

А вот и DriverEntry :
Код:
NTSTATUS DriverEntry(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS            status;

    test3DebugPrint(DBG_INIT, DBG_TRACE, __FUNCTION__"++");
    test3DebugPrint(DBG_INIT, DBG_INFO, "Compiled at %s on %s", __TIME__, __DATE__);

#ifdef DBG
//    DbgBreakPoint();
#endif

#ifdef TEST3_WMI_TRACE
    WPP_INIT_TRACING(DriverObject, RegistryPath);
#endif

    status = STATUS_SUCCESS;

    RtlZeroMemory(&g_Data, sizeof(TEST3_DATA));

    // save registry path for wmi
    g_Data.RegistryPath.Length = RegistryPath->Length;
    g_Data.RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
    g_Data.RegistryPath.Buffer = (PWCHAR)ExAllocatePoolWithTag(
                                            PagedPool,
                                            g_Data.RegistryPath.MaximumLength,
                                            TEST3_POOL_TAG
                                            );

    if (g_Data.RegistryPath.Buffer == NULL)
    {
        status = STATUS_INSUFFICIENT_RESOURCES;

        test3DebugPrint(DBG_INIT, DBG_ERR, __FUNCTION__": Failed to allocate memory for RegistryPath");

        return status;
    }

    RtlCopyUnicodeString(&g_Data.RegistryPath, RegistryPath);

    // detect current operating system
    if (IoIsWdmVersionAvailable(1, 0x30))
    {
        g_Data.WdmVersion = 0x0130;
    }
    else if (IoIsWdmVersionAvailable(1, 0x20))
    {
        g_Data.WdmVersion = 0x0120;
    }
    else if (IoIsWdmVersionAvailable(1, 0x10))
    {
        g_Data.WdmVersion = 0x0110;
    }
    else if (IoIsWdmVersionAvailable(1, 0x05))
    {
        g_Data.WdmVersion = 0x0105;
    }
    else
    {
        g_Data.WdmVersion = 0x0100;
    }

    // setup our dispatch function table in the driver object
    DriverObject->MajorFunction[IRP_MJ_PNP] = test3PnpDispatch;
    DriverObject->MajorFunction[IRP_MJ_POWER] = test3PowerDispatch;
    DriverObject->MajorFunction[IRP_MJ_CREATE] = test3CreateDispatch;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = test3CloseDispatch;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = test3DeviceIoControlDispatch;
    DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = test3InternalDeviceIoControlDispatch;
    DriverObject->MajorFunction[IRP_MJ_READ] = test3ReadDispatch;
    DriverObject->MajorFunction[IRP_MJ_WRITE] = test3WriteDispatch;
    DriverObject->MajorFunction[IRP_MJ_CLEANUP] = test3CleanupDispatch;
    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = test3SystemControlDispatch;
    DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = test3CreateNamedPipeDispatch;
    DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = test3FlushBuffersDispatch;

    DriverObject->DriverExtension->AddDevice = test3AddDevice;
    DriverObject->DriverUnload = test3Unload;

    test3DebugPrint(DBG_INIT, DBG_TRACE, __FUNCTION__"--. STATUS %x", status);

    return status;
}
« Последнее редактирование: 30-11-2007 22:22 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #5 : 16-08-2004 06:21 » 

mad, щас знакомый который мне это прислал, написал что это сгенерил он в компуваревской драйвер студии. Могу весь прект выложить если надо.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 17-08-2004 11:48 » 

По всей видимости это драйвер файловой системы, отвечающей за поддержку именованных каналов.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 17-08-2004 12:08 » 

SlavaI, неа Улыбаюсь после компиляции и инсталяции из инф файла получается ком порт в девайс менеджере в разделе портов.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
mad
Гость
« Ответ #8 : 17-08-2004 15:04 » 

а дай еще обработку старт девайс посмотреть.....очени интересно, что это за фигня....
Записан
mad
Гость
« Ответ #9 : 17-08-2004 15:04 » 

irp_mn_start_device
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #10 : 17-08-2004 18:46 » 

mad, я дома щас, сорцы на работе, закину с утреца как приду.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #11 : 18-08-2004 04:46 » 

Вот старт девайс :
Код:
NTSTATUS test3StartDevice(
    IN  PTEST3_DEVICE_EXTENSION    DeviceExtension,
    IN  PIRP                            Irp
    )
{
    NTSTATUS                        status = STATUS_SUCCESS;
    PCM_PARTIAL_RESOURCE_DESCRIPTOR resource;
    PCM_PARTIAL_RESOURCE_DESCRIPTOR resourceTrans;
    PCM_PARTIAL_RESOURCE_LIST       partialResourceList;
    PCM_PARTIAL_RESOURCE_LIST       partialResourceListTranslated;
    PIO_STACK_LOCATION              irpStack;
    POWER_STATE                     powerState;
    ULONG                           ii;

    test3DebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    // Get our current IRP stack location
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    // Do whatever initialization needed when starting the device:
    // gather information about it,  update the registry, etc.
    // At this point, the lower level drivers completed the IRP
    if ((irpStack->Parameters.StartDevice.AllocatedResources != NULL) &&
        (irpStack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL))
    {
        // Parameters.StartDevice.AllocatedResources points to a
        // CM_RESOURCE_LIST describing the hardware resources that
        // the PnP Manager assigned to the device. This list contains
        // the resources in raw form. Use the raw resources to program
        // the device.

        partialResourceList =
            &irpStack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList;

        resource = &partialResourceList->PartialDescriptors[0];

        // Parameters.StartDevice.AllocatedResourcesTranslated points
        // to a CM_RESOURCE_LIST describing the hardware resources that
        // the PnP Manager assigned to the device. This list contains
        // the resources in translated form. Use the translated resources
        // to connect the interrupt vector, map I/O space, and map memory.

        partialResourceListTranslated =
            &irpStack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList;

        resourceTrans = &partialResourceListTranslated->PartialDescriptors[0];

        // search the resources
        for (ii = 0;
             ii < partialResourceList->Count;
             ++ii, ++resource, ++resourceTrans)
        {

            switch (resource->Type)
            {
            case CmResourceTypePort:
                test3DebugPrint(DBG_PNP, DBG_INFO,  "Resource Type Port");
                test3DebugPrint(DBG_PNP, DBG_INFO, "Port.Start %I64x", resource->u.Port.Start.QuadPart);
                test3DebugPrint(DBG_PNP, DBG_INFO, "Port.Length %x", resource->u.Port.Length);
                break;
            case CmResourceTypeMemory:
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Resource Type Memory");
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Memory.Start %I64x", resource->u.Memory.Start.QuadPart);
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Memory.Length %x", resource->u.Memory.Length);
                break;
            case CmResourceTypeInterrupt:
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Resource Type Interrupt");
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Interrupt.Level %x", resourceTrans->u.Interrupt.Level);
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Interrupt.Vector %x", resourceTrans->u.Interrupt.Vector);
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Interrupt.Affinity %x\n", resourceTrans->u.Interrupt.Affinity);
                break;
            default:
                test3DebugPrint(DBG_PNP, DBG_TRACE, "Unknown Resource Type %x", resourceTrans->Type);
                break;
            }
        }
    }

    test3DebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

« Последнее редактирование: 30-11-2007 22:23 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
mad
Гость
« Ответ #12 : 18-08-2004 09:52 » 

ихмо я так думаю что это аналог mj_create, когда девайс регится как пайп xxx,  а приложение открывает хендл пайпа \\\\.\\pipe\\xxx......
Записан
mad
Гость
« Ответ #13 : 18-08-2004 09:54 » 

как-то криво сказал =)
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #14 : 18-08-2004 10:43 » 

Цитата: mad
как-то криво сказал =)

ага, я нифига не понял Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
mad
Гость
« Ответ #15 : 18-08-2004 12:28 » 

Ну...так скажем mj_create оповещатель драйвера, когда мы открываем драйвер CreateFile, а mj_create_named_pipe оповещатель драйвера, когда открываем драйвер через CreateNamedPipe. Я так думаю
Записан
mad
Гость
« Ответ #16 : 18-08-2004 12:30 » 

irp_mj_create же описан в ддк, а irp_mj_create_named_pipe работает по аналогичному принципу
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines