Document how to get file handle
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									cd6fe285b4
								
							
						
					
					
						commit
						71afd84033
					
				
							
								
								
									
										67
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								README.md
									
									
									
									
									
								
							@ -20,7 +20,34 @@ It is advisable to use the prebuilt and Microsoft-signed MSM files from [Wintun.
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
After loading the driver and creating a network interface the typical way using [SetupAPI](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setupapi), open the NDIS device object associated with the PnPInstanceId, enabling all forms of file sharing.
 | 
			
		||||
After loading the driver and creating a network interface the typical way using [SetupAPI](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setupapi), open the NDIS device object associated with the PnPInstanceId, enabling all forms of file sharing:
 | 
			
		||||
 | 
			
		||||
```C
 | 
			
		||||
TCHAR *InterfaceList = NULL;
 | 
			
		||||
for (;;) {
 | 
			
		||||
    free(InterfaceList);
 | 
			
		||||
    DWORD RequiredBytes;
 | 
			
		||||
    if (CM_Get_Device_Interface_List_Size(&RequiredBytes, (LPGUID)&GUID_DEVINTERFACE_NET,
 | 
			
		||||
        InstanceId, CM_GET_DEVICE_INTERFACE_LIST_PRESENT) != CR_SUCCESS)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    InterfaceList = calloc(sizeof(*InterfaceList), RequiredBytes);
 | 
			
		||||
    if (!InterfaceList)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    CONFIGRET Ret = CM_Get_Device_Interface_List((LPGUID)&GUID_DEVINTERFACE_NET, InstanceId,
 | 
			
		||||
                    InterfaceList, RequiredBytes, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
 | 
			
		||||
    if (Ret == CR_SUCCESS)
 | 
			
		||||
        break;
 | 
			
		||||
    if (Ret != CR_BUFFER_SMALL) {
 | 
			
		||||
        free(InterfaceList);
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
HANDLE WintunHandle = CreateFile(InterfaceList, GENERIC_READ | GENERIC_WRITE,
 | 
			
		||||
                                 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
 | 
			
		||||
                                 NULL, OPEN_EXISTING, 0, NULL);
 | 
			
		||||
free(InterfaceList);
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Ring layout
 | 
			
		||||
 | 
			
		||||
@ -68,10 +95,8 @@ typedef struct _TUN_PACKET {
 | 
			
		||||
In order to register the two `TUN_RING`s, prepare a registration struct as:
 | 
			
		||||
 | 
			
		||||
```C
 | 
			
		||||
typedef struct _TUN_REGISTER_RINGS
 | 
			
		||||
{
 | 
			
		||||
    struct
 | 
			
		||||
    {
 | 
			
		||||
typedef struct _TUN_REGISTER_RINGS {
 | 
			
		||||
    struct {
 | 
			
		||||
        ULONG RingSize;
 | 
			
		||||
        TUN_RING *Ring;
 | 
			
		||||
        HANDLE TailMoved;
 | 
			
		||||
@ -96,19 +121,19 @@ Reading packets from the send ring may be done as:
 | 
			
		||||
 | 
			
		||||
```C
 | 
			
		||||
for (;;) {
 | 
			
		||||
    TUN_PACKET *next = PopFromRing(r->Send.Ring);
 | 
			
		||||
    if (!next) {
 | 
			
		||||
        r->Send.Ring->Alertable = TRUE;
 | 
			
		||||
        next = PopFromRing(r->Send.Ring);
 | 
			
		||||
        if (!next) {
 | 
			
		||||
            WaitForSingleObject(r->Send.TailMoved, INFINITE);
 | 
			
		||||
            r->Send.Ring->Alertable = FALSE;
 | 
			
		||||
    TUN_PACKET *Next = PopFromRing(Rings->Send.Ring);
 | 
			
		||||
    if (!Next) {
 | 
			
		||||
        Rings->Send.Ring->Alertable = TRUE;
 | 
			
		||||
        Next = PopFromRing(Rings->Send.Ring);
 | 
			
		||||
        if (!Next) {
 | 
			
		||||
            WaitForSingleObject(Rings->Send.TailMoved, INFINITE);
 | 
			
		||||
            Rings->Send.Ring->Alertable = FALSE;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        r->Send.Ring->Alertable = FALSE;
 | 
			
		||||
        ResetEvent(r->Send.TailMoved);
 | 
			
		||||
        Rings->Send.Ring->Alertable = FALSE;
 | 
			
		||||
        ResetEvent(Rings->Send.TailMoved);
 | 
			
		||||
    }
 | 
			
		||||
    SendToClientProgram(next);
 | 
			
		||||
    SendToClientProgram(Next);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -120,10 +145,10 @@ Writing packets to the receive ring may be done as:
 | 
			
		||||
 | 
			
		||||
```C
 | 
			
		||||
for (;;) {
 | 
			
		||||
    TUN_PACKET *next = ReceiveFromClientProgram();
 | 
			
		||||
    WriteToRing(r->Receive.Ring, next);
 | 
			
		||||
    if (r->Receive.Ring->Alertable)
 | 
			
		||||
        SetEvent(r->Recieve.TailMoved);
 | 
			
		||||
    TUN_PACKET *Next = ReceiveFromClientProgram();
 | 
			
		||||
    WriteToRing(Rings->Receive.Ring, Next);
 | 
			
		||||
    if (Rings->Receive.Ring->Alertable)
 | 
			
		||||
        SetEvent(Rings->Recieve.TailMoved);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -208,3 +233,7 @@ If you possess an EV certificate for kernel mode code signing you should switch
 | 
			
		||||
Modify the `<CrossCertificateFile>` to contain the full path to the cross-signing certificate of CA that issued your certificate. You should be able to find its `.crt` file in `C:\Program Files (x86)\Windows Kits\10\CrossCertificates`. Note that the `$(WDKContentRoot)` expands to `C:\Program Files (x86)\Windows Kits\10\`.
 | 
			
		||||
 | 
			
		||||
If you already have `wintun.vcxproj.user` file, just add the `<PropertyGroup>` section.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
The entire contents of this repository, including all documentation code, is "Copyright © 2018-2019 WireGuard LLC. All Rights Reserved." and is licensed under the [GPLv2](COPYING).
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user