Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть способ заставить 32-битный код не перевирать System32 в SysWOW64? / 4 сообщений из 4, страница 1 из 1
07.10.2016, 02:09
    #39322360
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть способ заставить 32-битный код не перевирать System32 в SysWOW64?
Ну т.е. например
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  Public Declare Unicode Function GetNamedSecurityInfo Lib "advapi32.dll" Alias _
   "GetNamedSecurityInfoW" _
   (ByVal pObjectName As String, _
   ByVal ObjectType As SE_OBJECT_TYPE, _
   ByVal SecurityInfo As Integer, _
   ByRef ppsidOwner As IntPtr, _
   ByRef ppsidGroup As IntPtr, _
   ByRef ppDacl As IntPtr, _
   ByRef ppSacl As IntPtr, _
   ByRef ppSecurityDescriptor As IntPtr) As Integer

dwRes = GetNamedSecurityInfo("C:\Windows\System32\drivers\modem.sys", SE_OBJECT_TYPE.SE_FILE_OBJECT...



Возвращает 2 (Не удается найти указанный файл)
Очевидно авто-конвертирует путь в "C:\Windows\SysWOW64\drivers\modem.sys" и не находит.

Ну и вчера такая же проблема с MoveFileEx function

Не, в терию отправлять не надо, естественно в курсе.
С реестром например корректно бодаться не проблема.
Также понимаю, что если скомпилирую под x64 то ошибка уйдет.
Но вот способ сказать 32-битной проге "Дура, не используй эту адресацию здесь и сейчас" есть?

Хотелось бы реализовать все что хочу сделать одним универсальным 32-бит exe-шником (по возможности). На какой системе я нахожусь, это я определю без проблем.
И хотя я обычно контролирую для всех своих Net кодов возможность корректно работать при x64 компиляции,
но реально этим не пользовался и всегда делал x86 Release. Причина, почему не стал дурить с x64 - очень много компонентов, кот. не будут работать с x64 кодом.

Или все-таки придется делать 2 файла под x64 и x86 (AnyCPU не хочу - глючит, у меня на VS2013EE если новый проект AnyCPU всегда работает как 32 бит, полная студия стоит, но я ее ненавижу).
...
Рейтинг: 0 / 0
07.10.2016, 08:55
    #39322433
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть способ заставить 32-битный код не перевирать System32 в SysWOW64?
Wow64DisableWow64FsRedirection function

Wow64RevertWow64FsRedirection function

? оно наверно

Хотя наверно все одно два файла делать придется.
Я там кроме прав/копирований еще SetupDiSetClassInstallParams/SetupDiCallClassInstaller использую для выключения/включения девайсов
Часть SetupDi...функций работают и из 32-битного кода, а вот чтоб напр. установить девайс, нужен 64-битный на x64.
Проверять надо.
...
Рейтинг: 0 / 0
07.10.2016, 09:19
    #39322462
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть способ заставить 32-битный код не перевирать System32 в SysWOW64?
Дмитрий77Хотя наверно все одно два файла делать придется.
Я там кроме прав/копирований еще SetupDiSetClassInstallParams/SetupDiCallClassInstaller использую для выключения/включения девайсов
Часть SetupDi...функций работают и из 32-битного кода, а вот чтоб напр. установить девайс, нужен 64-битный на x64.
Проверять надо.

Не, вот такая хрень модемы вырубает и включает на x64 из 32-битного exe:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
 Public Sub EnableDisableModems(ByVal enable As Boolean)
    'enum-ератор на основании GUID_DEVINTERFACE_MODEM

    Dim bResult As Boolean
    Dim m_ClassGUID As Guid
    Dim hDeviceInfoSet As IntPtr
    Dim wIndex As Integer
    Dim m_DeviceInfoData As SP_DEVINFO_DATA
    Dim dwRes As Integer

    'можно CLSIDFromString вместо IIDFromString -пофиг
    dwRes = IIDFromString(GUID_DEVINTERFACE_MODEM, m_ClassGUID)
    If dwRes <> S_OK Then
      'Debug.Print("IIDFromString Error " & RaiseAPIErrorByNumber(dwRes))
      Exit Sub
    End If

    'DIGCF_DEVICEINTERFACE для этого m_ClassGUID -существенно!!!
    hDeviceInfoSet = SetupDiGetClassDevs(m_ClassGUID, vbNullString, 0, _
     DIGCF_PROFILE Or DIGCF_DEVICEINTERFACE) 'DIGCF_PRESENT Or
    If hDeviceInfoSet = INVALID_HANDLE_VALUE Then
      'Debug.Print("SetupDiGetClassDevs Error " & RaiseAPIErrorByNumber(Err.LastDllError))
    Else
      'Debug.Print("hDeviceInfoSet=" & hDeviceInfoSet.ToString)

      wIndex = 0
      m_DeviceInfoData.cbSize = Marshal.SizeOf(m_DeviceInfoData)
      Do
        bResult = SetupDiEnumDeviceInfo(hDeviceInfoSet, wIndex, m_DeviceInfoData)
        If (bResult = False) And (Err.LastDllError = ERROR_NO_MORE_ITEMS) Then Exit Do

        Dim params As SP_PROPCHANGE_PARAMS
        params.ClassInstallHeader.cbSize = Marshal.SizeOf(params.ClassInstallHeader)
        params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE
        params.Scope = DICS_FLAG_GLOBAL
        If enable Then
          params.StateChange = DICS_ENABLE
        Else
          params.StateChange = DICS_DISABLE
        End If

        If SetupDiSetClassInstallParams(hDeviceInfoSet, m_DeviceInfoData, params, Marshal.SizeOf(params)) Then
          'SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDeviceInfoSet, m_DeviceInfoData)
          SetupDiChangeState(hDeviceInfoSet, m_DeviceInfoData)
        End If

        wIndex = wIndex + 1
      Loop

      SetupDiDestroyDeviceInfoList(hDeviceInfoSet)
    End If
  End Sub



Поэтому за корректирование путей стоит побороться, чтоб не плодить x64/x86 версий.
...
Рейтинг: 0 / 0
07.10.2016, 19:16
    #39323024
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть способ заставить 32-битный код не перевирать System32 в SysWOW64?
Дмитрий77 Wow64DisableWow64FsRedirection function

Wow64RevertWow64FsRedirection function


Да оно.
Единственное, как следует из документации надо не забывать делать Wow64RevertWow64FsRedirection.
Хотя я пока не нарвался.
Для того что мне нужно видимо сделаю Wow64DisableWow64FsRedirection один раз в начале и один раз Wow64RevertWow64FsRedirection в конце.
Просто отключение нужно в нескольких местах: переназначение владельца системного файла, изменение прав в файле, копирование в системный путь, и все это без Wow64DisableWow64FsRedirection из 32-битного кода корректно не фурычит.
А вот для SetupDi пофиг, включены или выключены редиректы.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть способ заставить 32-битный код не перевирать System32 в SysWOW64? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]