Собственно, у кого есть САБЖ? У меня есть только для 2000, а поиск ни чего не дал: Код (Text): typedef struct _LPCP_PORT_OBJECT { ULONG Length; ULONG Flags; struct _LPCP_PORT_OBJECT *ConnectionPort; struct _LPCP_PORT_OBJECT *ConnectedPort; LPCP_PORT_QUEUE MsgQueue; CLIENT_ID Creator; PVOID ClientSectionBase; PVOID ServerSectionBase; PVOID PortContext; ULONG MaxMessageLength; ULONG MaxConnectionInfoLength; PETHREAD ClientThread; SECURITY_QUALITY_OF_SERVICE SecurityQos; SECURITY_CLIENT_CONTEXT StaticSecurity; LIST_ENTRY LpcReplyChainHead; // Only in _COMMUNICATION ports LIST_ENTRY LpcDataInfoChainHead; // Only in _COMMUNICATION ports PEPROCESS ServerProcess; // Only in SERVER_CONNECTION ports ULONG Reserved; KEVENT WaitEvent ; } LPCP_PORT_OBJECT, *PLPCP_PORT_OBJECT;
Код (Text): lkd> dt _LPCP_PORT_OBJECT nt!_LPCP_PORT_OBJECT +0x000 ConnectionPort : Ptr32 _LPCP_PORT_OBJECT +0x004 ConnectedPort : Ptr32 _LPCP_PORT_OBJECT +0x008 MsgQueue : _LPCP_PORT_QUEUE +0x018 Creator : _CLIENT_ID +0x020 ClientSectionBase : Ptr32 Void +0x024 ServerSectionBase : Ptr32 Void +0x028 PortContext : Ptr32 Void +0x02c ClientThread : Ptr32 _ETHREAD +0x030 SecurityQos : _SECURITY_QUALITY_OF_SERVICE +0x03c StaticSecurity : _SECURITY_CLIENT_CONTEXT +0x078 LpcReplyChainHead : _LIST_ENTRY +0x080 LpcDataInfoChainHead : _LIST_ENTRY +0x088 ServerProcess : Ptr32 _EPROCESS +0x088 MappingProcess : Ptr32 _EPROCESS +0x08c MaxMessageLength : Uint2B +0x08e MaxConnectionInfoLength : Uint2B +0x090 Flags : Uint4B +0x094 WaitEvent : _KEVENT
Так, по ходу дела возник еще вопрос. Имея объект порта необходимо получить его название, но что-то в структуре подобных полей не наблюдается. Как это реализовать? Просто есть желание найти определенный порт по названию не прибегая к вызову АПИ, манипулируя только ядерными данными...
Вопрос снят: Код (Text): POBJECT_NAME GetNameOfObject(PVOID pObject) { POBJECT_NAME pObjectName = NULL; POBJECT_HEADER pObjectHdr; if (_MmIsAddressValid(pObject)) { pObjectHdr = (POBJECT_HEADER) ((PBYTE)pObject - SIZE_OF_OBJECT_HEADER); if (_MmIsAddressValid(pObjectHdr)) { if (pObjectHdr->SubHeaderInfo.NameOffset != 0) { pObjectName = (POBJECT_NAME) ((PBYTE)pObjectHdr - pObjectHdr->SubHeaderInfo.NameOffset); } } } return pObjectName; }