Page 1 of 1

Удалённые Рабочие Столы и Локальные диски.

Posted: Fri 04 Mar, 2016 11:16
by cmd.exe
Давно встретился с тем,что Фар не умеет работать с Локальными дисками при работе через RDP.
Если есть какие-то идеи у сообщество буду рад услушить. Про \\tsclient\... знаем, но хотим что-бы из коробки.

Удалённые Рабочие Столы и Локальные диски.

Posted: Fri 04 Mar, 2016 12:53
by DrKnS
\\tsclient и есть изкоробки, изкоробочнее не бывает.

Удалённые Рабочие Столы и Локальные диски.

Posted: Fri 04 Mar, 2016 13:35
by cmd.exe
DrKnS wrote:\\tsclient и есть изкоробки, изкоробочнее не бывает.
Имеется ввиду по Alt+F1 и Alt+F2

Удалённые Рабочие Столы и Локальные диски.

Posted: Thu 16 Jun, 2016 02:58
by Freeman
Таки да, было бы удобно видеть их как в Проводнике.

Удалённые Рабочие Столы и Локальные диски.

Posted: Wed 22 Jun, 2016 22:31
by Smitis
Добавление пункта выбора \\tsclient-дисков в меню выбора дисков:

Удалённые Рабочие Столы и Локальные диски.

Posted: Sat 25 Jun, 2016 16:13
by Smitis
Задался вопросом, а как получить список дисков не через net use. Весь поиск приводит к WNetOpenEnum, WNetEnumResource
Но вот такое приводит к ошибке 487 "Попытка обращения к неверному адресу".
  1. local function ShowErr(err)
  2.  
  3.     if err==0 then return "" end
  4.  
  5.     far.Message( tostring(err), "ERROR", nil, "we" )
  6.  
  7. end
  8.  
  9.  
  10.  
  11. local ffi = require "ffi"
  12.  
  13. local C = ffi.C
  14.  
  15. local function safe_cdef(def) pcall(ffi.cdef,def) end
  16.  
  17. local mpr = ffi.load("mpr.dll")
  18.  
  19.  
  20.  
  21. -- winnetwk.h
  22.  
  23. local RESOURCE_CONNECTED = 0x00000001
  24.  
  25. local RESOURCE_GLOBALNET = 0x00000002
  26.  
  27. local RESOURCETYPE_ANY = 0
  28.  
  29. local RESOURCETYPE_DISK = 0x00000001
  30.  
  31. local ERROR_NO_MORE_ITEMS = 259
  32.  
  33. local RESOURCEUSAGE_CONNECTABLE = 0x00000001
  34.  
  35. local RESOURCEUSAGE_CONTAINER = 0x00000002
  36.  
  37. local RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004
  38.  
  39. local TSCLIENT = "\\\\TSCLIENT\0"
  40.  
  41.  
  42.  
  43. safe_cdef [=[
  44.  
  45.     typedef struct _NETRESOURCE {
  46.  
  47.         DWORD  dwScope;
  48.  
  49.         DWORD  dwType;
  50.  
  51.         DWORD  dwDisplayType;
  52.  
  53.         DWORD  dwUsage;
  54.  
  55.         LPTSTR lpLocalName;
  56.  
  57.         LPTSTR lpRemoteName;
  58.  
  59.         LPTSTR lpComment;
  60.  
  61.         LPTSTR lpProvider;
  62.  
  63.     } NETRESOURCE, *LPNETRESOURCE;
  64.  
  65. ]=]
  66.  
  67. ffi.cdef [=[
  68.  
  69.     DWORD WNetOpenEnumW( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385478.aspx
  70.  
  71.         DWORD         dwScope,       // _In_
  72.  
  73.         DWORD         dwType,        // _In_
  74.  
  75.         DWORD         dwUsage,       // _In_
  76.  
  77.         LPNETRESOURCE lpNetResource, // _In_
  78.  
  79.         LPHANDLE      lphEnum        // _Out_
  80.  
  81.     );
  82.  
  83.     DWORD WNetEnumResource( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385449.aspx
  84.  
  85.         HANDLE  hEnum,       // _In_
  86.  
  87.         LPDWORD lpcCount,    // _Inout_
  88.  
  89.         LPVOID  lpBuffer,    // _Out_
  90.  
  91.         LPDWORD lpBufferSize // _Inout_
  92.  
  93.     );
  94.  
  95.     DWORD WNetCloseEnum( HANDLE hEnum );
  96.  
  97. ]=]
  98.  
  99.  
  100.  
  101. local NetResource = ffi.new("NETRESOURCE")
  102.  
  103. local lpNetResource = ffi.cast("void*",NetResource)
  104.  
  105.  
  106.  
  107. local hEnum = ffi.new("HANDLE")
  108.  
  109. local lphEnum = ffi.cast("void*",hEnum)
  110.  
  111. --ShowErr( mpr.WNetOpenEnumW(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,lpNetResource,lphEnum) )
  112.  
  113. ShowErr( mpr.WNetOpenEnumW(RESOURCE_CONNECTED,RESOURCETYPE_DISK,0,ffi.NULL,lphEnum) )
  114.  
  115.  
  116.  
  117. -- тут мы будем вызывать WNetEnumResourceW
  118.  
  119.  
  120.  
  121. mpr.WNetCloseEnum(hEnum)
В чём может быть затык?

Удалённые Рабочие Столы и Локальные диски.

Posted: Sat 25 Jun, 2016 17:29
by DrKnS
local lphEnum = ffi.cast("void*",hEnum) - это каст (причём бесполезный), а не получение адреса.

Должно быть что-то типа:

Code: Select all

local hEnum = ffi.new("HANDLE[1]")
mpr.WNetOpenEnumW(RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, ffi.NULL, hEnum)
// use hEnum[0]

Удалённые Рабочие Столы и Локальные диски.

Posted: Fri 15 Dec, 2017 14:39
by cmd.exe
Есть вопрос, а возможно это встроить в сам фар а не макросом.