Список процессов, открывших файл

Тема в разделе "WASM.WIN32", создана пользователем gilg, 25 мар 2006.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В распоряжении имеется FILE_OBJECT, описывающий открытый файл. Возможно ли через этот объект получить список всех процессов, которые открыли этот же файл?

    Т.е. по данному file_object требуется получить список всех имеющихся в системе file_object-ов, ссылающихся на этот же файл. Хотелось бы обойтись без перечисления остальных объектов, не имеющих к этому файлу отношения.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Нет, невозможно. Если два или более процесса откроют один и тот же файл, то при каждом успешном открытии будет создана новая структура FILE_OBJECT. Все эти структуры будут описывать один и тотже файл, но сами никак не связаны друг с другом. Так что список можно получить только путем перечисления всех открытых в системе хендлов.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Мне требуется получить FILE_OBJECT для заданного адреса tcp/ip. Где в нем хранится этот адрес? Есть подозрение, что в FsContext, но никакого конкретного описания не нашел.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В сетях не шарю, но простой поиск в 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."
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Спасибо, Four-F. Стало понятно, в какую сторону копать дальше
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Похоже все-таки придется еще раз поднять этот вопрос :) Кому-нибудь попадалась информация о том, как драйвер tcp/ip использует поля FsContext и FsContext2? Единственное, что нашел полезного - на koders.com:
    Код (Text):
    1.  
    2. typedef PVOID CONNECTION_CONTEXT;
    3.  
    4. /* Transport (TCP/UDP) endpoint context structure. The FileObject->FsContext
    5.    field holds a pointer to this structure */
    6. typedef struct _TRANSPORT_CONTEXT {
    7.     union {
    8.         HANDLE AddressHandle;
    9.         CONNECTION_CONTEXT ConnectionContext;
    10.         HANDLE ControlChannel;
    11.     } Handle;
    12.     ULONG RefCount;
    13.     BOOL CancelIrps;
    14.     KEVENT CleanupEvent;
    15. } TRANSPORT_CONTEXT, *PTRANSPORT_CONTEXT;


    AddressHandle точно указывает не на TA_IP_ADDRESS, а вот на что - вопрос.



    Еще один вопрос. С тем, как данные отправляются по сети все ясно. Есть FILE_OBJECT, по нему ищется DEVICE_OBJECT, по нему DRIVER_OBJECT, формируется IRP с указателем на этот FILE_OBJECT, в котором в принципе есть вся нужная информация.

    А вот каким образом данные принимаются? Протокольный драйвер получает пакет, выбирает из него адреса, формирует структуру TA_IP_ADDRESS для этого пакета. Чтобы передать этот пакет нужному процессу, драйвер должен каким-то образом получить FILE_OBJECT. Вряд ли он для этого просматривает все открытые объекты, значит соответствие между адресами и объектами должно быть где-то закешировано.

    Или я не правильно понимаю работу сетевого стека? Кажется, что все очевидно, пока что-нибудь конкретное сделать не потребуется :)