Le NP assure la gestion du voisinage reseau sous windows, il s’occupe aussi du mappage des lecteurs reseau. Il communique avec le NR grace a des ioctl. C’est lui qui indique au drivers qu’il faut se connecter a une resource reseau.
Adresse reel:
\Device\DriversName\;C:\server\share pour un lecteur reseau mappe.
\Device\FSDriver\S:\user@host\foo\bar
\Device\NullMiniRdr\;0:\nulsvr\share (addresse de test du minirdr (nulmrx))
NPGetCaps : enumere les capacites du drivers, pour WNNC_ENUMERATION:
WNNC_ENUM_GLOBAL gestion du voisinage reseau (eumeration globales des ressources)
WNNC_ENUM_LOCAL gestion des resources connectes
WNNC_ENUM_CONTEXT gestion des utilisateurs (login/pass pour un reseau)
NPOpenEnum, NPEnumResource : enumerent les resources disponible sur le reseau (ordinateur, partage, imprimante, etc), dans le cas d’une visite du reseau par le voisinage reseau localname doit etre null, et pour pouvoir parcourir les partages il faut que le NR gere les Unc.
LocalName correspond a l’adresse mapper (il s’agit donc d’une lettre (ex c:)). Si l’adresse est nul elle n’est pas mappe a un lecteur reseau
RemoteName correspond a l’adresse de la resource demande, par exemple une architecture type smb retournera:
NPAddConnection : indique au NR qu’il doit etablir une connection avec la ressource demande, effectue le mappage reseau si localname n’est pas null et si le mappage n’est pas deja fait.
NPGetResource : cherche le remotename associe avec un chemin local, et verifie que le lecteur reseau soit monte.
le partage “z:” mappe sur \\192.168.0.9\shared a pour adresse reel : \Device\SmbSampleMiniRedirector\;Z:\192.168.0.9\shared
NPAddConnection recevra comme parametre (local=”Z:”, remote:=”\\192.168.0.9\shared”)
UNC: unified name convention
FsRtlRegisterUncProvider : enregistre le drivers aupres du Multiple UNC Provider (MUP), attention l’enregistrement produit un irp qu’il faut resoudre correctement.On appelle cette fonction dans DriverEntry.(fait une requete IRP_MJ_CREATE qui doit retourner STATUS_SUCCESS)
FsRtlDeregisterUncProvider : se desenregistre aupres du MUP
IoRegisterFileSystem : pr les systemes de fichiers “physique”, charge les drivers sous-jacents
IOCTL_REDIR_QUERY_PATH : demande la taille de la plus grande chaine reconnu dans le path fourni (savoir qui va recevoir les requetes pour une certaine adresse unc)
On ouvre l’explorateur on va dans le voisinage reseau, on clique sur notre network provider:
On arrive sur un share:
HANDLE ThreadHandle;
#define DE_THREAD_WAIT_MSEC (1000)
VOID DriverEntry_Async(PVOID Parameter)
{
NTSTATUS Status = STATUS_SUCCESS;
LARGE_INTEGER waitPeriod;
waitPeriod = RtlConvertLongToLargeInteger((LONG) -(10 * 1000 * DE_THREAD_WAIT_MSEC));
KeDelayExecutionThread(KernelMode, FALSE, &waitPeriod);
Status=STATUS_SUCCESS;
PsTerminateSystemThread(Status);
return;
}
Status = PsCreateSystemThread(&ThreadHandle,THREAD_ALL_ACCESS, 0, 0, 0, DriverEntry_Async, 0);