Sdílet prostřednictvím


Odpojení klientského modulu od modulu zprostředkovatele

Když se klientský modul oderegistruje s registrátorem síťového modulu (NMR) voláním funkce NmrDeregisterClient, NMR volá funkci zpětného volání klientského modulu ClientDetachProvider, jednou pro každý modul poskytovatele, ke kterému je připojený, aby umožnil klientskému modulu se odpojit od všech modulů zprostředkovatele v rámci procesu deregistrace.

Navíc kdykoli se modul poskytovatele, ke kterému je klientský modul připojen, deregistruje s NMR pomocí funkce NmrDeregisterProvider, NMR také volá zpětnou funkci ClientDetachProvider, aby se klientský modul mohl odpojit od modulu poskytovatele jako součást procesu zrušení registrace modulu poskytovatele.

Po zavolání funkce zpětného volání ClientDetachProvider nesmí modul klienta provádět žádná další volání žádné z funkcí síťového programovacího rozhraní (Network Programming Interface, NPI) modulu poskytovatele . Pokud neexistují žádná probíhající volání funkcí NPI modulu poskytovatele ve chvíli, kdy je volána zpětná funkce ClientDetachProvider klientského modulu, měla by zpětná funkce ClientDetachProvider vrátit STATUS_SUCCESS.

Pokud probíhá volání jedné nebo více funkcí NPI modulu zprostředkovatele v době, kdy je volána funkce zpětného volání ClientDetachProvider klientského modulu, měla by funkce zpětného volání ClientDetachProvider vrátit STATUS_PENDING. V tomto případě musí klientský modul zavolat funkci NmrClientDetachProviderComplete po dokončení všech probíhajících volání funkcí NPI modulu poskytovatele. Volání NmrClientDetachProviderComplete oznámí NMR, že odpojení klientského modulu od modulu poskytovatele je dokončeno.

Další informace o tom, jak sledovat počet probíhajících volání funkcí NPI modulu poskytovatele, najdete v tématu Aspekty programování.

Pokud klientský modul implementuje ClientCleanupBindingContext funkci zpětného volání, NMR volá ClientCleanupBindingContext funkci zpětného volání poté, co jak klientský modul, tak modul zprostředkovatele dokončí vzájemné odpojení. Funkce zpětného volání klientského modulu ClientCleanupBindingContext by měla provést veškeré nezbytné vyčištění dat obsažených v kontextové struktuře vazby klientského modulu. Pak by měla uvolnit paměť pro strukturu kontextu vazby, pokud klientský modul dynamicky přidělil paměť pro strukturu.

Například:

// ClientDetachProvider callback function
NTSTATUS
  ClientDetachProvider(
    IN PVOID ClientBindingContext
    )
{
  PCLIENT_BINDING_CONTEXT BindingContext;

  // Get a pointer to the binding context
  BindingContext = (PCLIENT_BINDING_CONTEXT)ClientBindingContext;

  // Set a flag indicating that the client module is detaching
  // from the provider module so that no more calls are made to
  // the provider module's NPI functions.
  ...

  // Check if there are no in-progress NPI function calls to the
  // provider module
  if (...)
  {
    // Return success status indicating detachment is complete
    return STATUS_SUCCESS;
  }

  // There are one or more in-progress NPI function calls
  // to the provider module
  else
  {
    // Return pending status indicating detachment is pending
    // completion of the in-progress NPI function calls
    return STATUS_PENDING;

    // When the last in-progress call to the provider module's
    // NPI functions completes, the client module must call
    // NmrClientDetachProviderComplete() with the binding handle
    // for the attachment to the provider module.
  }
}

// ClientCleanupBindingContext callback function
VOID
  ClientCleanupBindingContext(
    IN PVOID ClientBindingContext
    )
{
  PCLIENT_BINDING_CONTEXT BindingContext;

  // Get a pointer to the binding context
  BindingContext = (PCLIENT_BINDING_CONTEXT)ClientBindingContext;

  // Clean up the client binding context structure
  ...

  // Free the memory for client's binding context structure
  ExFreePoolWithTag(
    BindingContext,
    BINDING_CONTEXT_POOL_TAG
    );
}