Skip to content

Instantly share code, notes, and snippets.

@glacjay
Created September 19, 2010 16:24
Show Gist options
  • Save glacjay/586892 to your computer and use it in GitHub Desktop.
Save glacjay/586892 to your computer and use it in GitHub Desktop.

Revisions

  1. glacjay created this gist Sep 19, 2010.
    55 changes: 55 additions & 0 deletions tun-ping-win.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    import _winreg as reg
    import win32file


    adapter_key = r'SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}'


    def get_device_guid():
    with reg.OpenKey(reg.HKEY_LOCAL_MACHINE, adapter_key) as adapters:
    try:
    for i in xrange(10000):
    key_name = reg.EnumKey(adapters, i)
    with reg.OpenKey(adapters, key_name) as adapter:
    try:
    component_id = reg.QueryValueEx(adapter, 'ComponentId')[0]
    if component_id == 'tap0801':
    return reg.QueryValueEx(adapter, 'NetCfgInstanceId')[0]
    except WindowsError, err:
    pass
    except WindowsError, err:
    pass

    def CTL_CODE(device_type, function, method, access):
    return (device_type << 16) | (access << 14) | (function << 2) | method;

    def TAP_CONTROL_CODE(request, method):
    return CTL_CODE(34, request, method, 0)

    TAP_IOCTL_CONFIG_POINT_TO_POINT = TAP_CONTROL_CODE(5, 0)
    TAP_IOCTL_SET_MEDIA_STATUS = TAP_CONTROL_CODE(6, 0)
    TAP_IOCTL_CONFIG_TUN = TAP_CONTROL_CODE(10, 0)


    if __name__ == '__main__':
    guid = get_device_guid()
    handle = win32file.CreateFile(r'\\.\Global\%s.tap' % guid,
    win32file.GENERIC_READ | win32file.GENERIC_WRITE,
    win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE,
    None, win32file.OPEN_EXISTING,
    win32file.FILE_ATTRIBUTE_SYSTEM, # | win32file.FILE_FLAG_OVERLAPPED,
    None)
    print(handle.handle)
    if False:
    win32file.DeviceIoControl(handle, TAP_IOCTL_CONFIG_POINT_TO_POINT,
    '\xc0\xa8\x11\x01\xc0\xa8\x11\x10', None);
    else:
    win32file.DeviceIoControl(handle, TAP_IOCTL_SET_MEDIA_STATUS, '\x01\x00\x00\x00', None)
    win32file.DeviceIoControl(handle, TAP_IOCTL_CONFIG_TUN,
    '\x0a\x03\x00\x01\x0a\x03\x00\x00\xff\xff\xff\x00', None)
    while True:
    l, p = win32file.ReadFile(handle, 2000)
    q = p[:12] + p[16:20] + p[12:16] + p[20:]
    win32file.WriteFile(handle, q)
    print(p, q)
    win32file.CloseHandle(handle)