В распоряжении имеется FILE_OBJECT, описывающий открытый файл. Возможно ли через этот объект получить список всех процессов, которые открыли этот же файл? Т.е. по данному file_object требуется получить список всех имеющихся в системе file_object-ов, ссылающихся на этот же файл. Хотелось бы обойтись без перечисления остальных объектов, не имеющих к этому файлу отношения.
Нет, невозможно. Если два или более процесса откроют один и тот же файл, то при каждом успешном открытии будет создана новая структура FILE_OBJECT. Все эти структуры будут описывать один и тотже файл, но сами никак не связаны друг с другом. Так что список можно получить только путем перечисления всех открытых в системе хендлов.
Мне требуется получить FILE_OBJECT для заданного адреса tcp/ip. Где в нем хранится этот адрес? Есть подозрение, что в FsContext, но никакого конкретного описания не нашел.
В сетях не шарю, но простой поиск в DDK дал это: "TdiDispatchCreate: IrpSp->FileObject Pointer to a file object that the I/O manager creates to represent the address, connection endpoint, or control channel. The transport driver sets the FsContext and possibly FsContext2 fieldss in this file object to access driver-allocated context areas set up in TdiDispatchCreate to track subsequent I/O requests on the address, connection endpoint, or control channel. TDI_LISTEN: Part of the context that each transport maintains at FsContext or FsContext2 for a connection endpoint is a pointer to the file object that represents the associated address, which the transport sets up when it makes the association."
Похоже все-таки придется еще раз поднять этот вопрос Кому-нибудь попадалась информация о том, как драйвер tcp/ip использует поля FsContext и FsContext2? Единственное, что нашел полезного - на koders.com: Код (Text): typedef PVOID CONNECTION_CONTEXT; /* Transport (TCP/UDP) endpoint context structure. The FileObject->FsContext field holds a pointer to this structure */ typedef struct _TRANSPORT_CONTEXT { union { HANDLE AddressHandle; CONNECTION_CONTEXT ConnectionContext; HANDLE ControlChannel; } Handle; ULONG RefCount; BOOL CancelIrps; KEVENT CleanupEvent; } TRANSPORT_CONTEXT, *PTRANSPORT_CONTEXT; AddressHandle точно указывает не на TA_IP_ADDRESS, а вот на что - вопрос. Еще один вопрос. С тем, как данные отправляются по сети все ясно. Есть FILE_OBJECT, по нему ищется DEVICE_OBJECT, по нему DRIVER_OBJECT, формируется IRP с указателем на этот FILE_OBJECT, в котором в принципе есть вся нужная информация. А вот каким образом данные принимаются? Протокольный драйвер получает пакет, выбирает из него адреса, формирует структуру TA_IP_ADDRESS для этого пакета. Чтобы передать этот пакет нужному процессу, драйвер должен каким-то образом получить FILE_OBJECT. Вряд ли он для этого просматривает все открытые объекты, значит соответствие между адресами и объектами должно быть где-то закешировано. Или я не правильно понимаю работу сетевого стека? Кажется, что все очевидно, пока что-нибудь конкретное сделать не потребуется