MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« : 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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #2 : 13-08-2004 11:50 » |
|
И не приходит в обычные 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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #5 : 16-08-2004 06:21 » |
|
mad, щас знакомый который мне это прислал, написал что это сгенерил он в компуваревской драйвер студии. Могу весь прект выложить если надо.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #6 : 17-08-2004 11:48 » |
|
По всей видимости это драйвер файловой системы, отвечающей за поддержку именованных каналов.
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #10 : 17-08-2004 18:46 » |
|
mad, я дома щас, сорцы на работе, закину с утреца как приду.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #14 : 18-08-2004 10:43 » |
|
как-то криво сказал =) ага, я нифига не понял
|
|
|
Записан
|
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 работает по аналогичному принципу
|
|
|
Записан
|
|
|
|
|