Menginisialisasi Struktur Data NMR

Sebelum aplikasi Winsock Kernel (WSK) dapat mendaftar dengan Network Module Registrar (NMR), aplikasi harus terlebih dahulu menginisialisasi struktur berikut.

Semua struktur data ini harus tetap valid dan tinggal dalam memori selama aplikasi WSK terdaftar di NMR.

Contoh kode berikut menunjukkan bagaimana aplikasi WSK dapat menginisialisasi semua struktur data yang tercantum sebelumnya.

// Include the WSK header file
#include "wsk.h"

// Structure for the WSK application's network module identification
const NPI_MODULEID ModuleId =
{
  sizeof(NPI_MODULEID),
  MIT_GUID,
  { ... }  // A GUID that uniquely identifies the WSK application
};

// Prototypes for the WSK application's NMR API callback functions
NTSTATUS
  ClientAttachProvider(
    IN HANDLE NmrBindingHandle,
    IN PVOID ClientContext,
    IN PNPI_REGISTRATION_INSTANCE ProviderRegistrationInstance
    );

NTSTATUS
  ClientDetachProvider(
    IN PVOID ClientBindingContext
    );

VOID
  ClientCleanupBindingContext(
    IN PVOID ClientBindingContext
    );

// Structure for the WSK application's characteristics
const NPI_CLIENT_CHARACTERISTICS Characteristics =
{
  0,
  sizeof(NPI_CLIENT_CHARACTERISTICS),
  ClientAttachProvider,
  ClientDetachProvider,
  ClientCleanupBindingContext,
  {
    0,
    sizeof(NPI_REGISTRATION_INSTANCE),
    &NPI_WSK_INTERFACE_ID,
    &ModuleId,
    0,
    NULL
  }
};

Aplikasi WSK memanggil fungsiNmrRegisterClient untuk mendaftarkan aplikasi dengan NMR.

Misalnya:

// Variable to contain the handle for the registration with the NMR
HANDLE RegistrationHandle;

// DriverEntry function
NTSTATUS
  DriverEntry(
    PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
    )
{
  NTSTATUS Status;

  .
  .
  .

  // Register the WSK application with the NMR
  Status = NmrRegisterClient(
    &Characteristics,
    NULL,
    &RegistrationHandle
    );

  if(!NT_SUCCESS(Status)) {
      .
      .
      .
      return Status;
  }

  .
  .
  .
}

Aplikasi WSK tidak diwajibkan untuk memanggil NmrRegisterClient dari dalam fungsi DriverEntry. Misalnya, jika aplikasi WSK adalah subkomponen driver yang kompleks, pendaftaran aplikasi mungkin hanya terjadi ketika subkomponen aplikasi WSK diaktifkan.