Трудности с инициализацией AWE

Тема в разделе "WASM.BEGINNERS", создана пользователем serj, 20 сен 2007.

  1. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    Мне надо получить доступ кбольшому количеству памяти и игры с /3GB не помогают. Решил попробовать AWE, вроде устраивает по функционалу, только возникли проблемы с привелегиями.

    Если я понял, надо получить права на "Lock Page in Memory".
    Пробовал два варианта:
    Код (Text):
    1. .data
    2. align 4
    3. tp TOKEN_PRIVILEGES<>        
    4.  
    5. .code
    6. _EnablePrivilege proc
    7. local hToken:dword
    8.         pusha
    9.         invoke    GetCurrentProcess
    10.         lea       ebx,hToken
    11.         invoke    OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES,ebx
    12.         mov     tp.PrivilegeCount, 1
    13.         lea     ecx,tp.Privileges[0].Luid
    14.         invoke  LookupPrivilegeValue,NULL, addr lpLockMem, ecx
    15.         mov     eax,tp.Privileges[0].Attributes
    16.         mov     tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
    17.         invoke  AdjustTokenPrivileges,hToken, FALSE, addr tp, sizeof tp, NULL, NULL
    18.         invoke  CloseHandle,hToken
    19.         popa
    20.         ret
    21. _EnablePrivilege endp
    И через вызов setupapi.
    Код (Text):
    1. .data
    2. SetupDLL db "setupapi.dll",0
    3. lpEnablePrivilege db "pSetupEnablePrivilege",0
    4. uLockPrivilege dw SeLockMemoryPrivilege,0
    5.  
    6. .code
    7.         invoke  LoadLibrary,addr SetupDLL
    8.         mov     hEnablePrivilege,eax
    9.         or      eax,eax
    10.         jz      Crash0
    11.         invoke  GetProcAddress,hEnablePrivilege,addr lpEnablePrivilege
    12.         or      eax,eax
    13.         jz      Crash1
    14.         push    ebx
    15.         mov     ebx,eax
    16.         mov     eax,TRUE
    17.         push    eax
    18.         mov     eax,offset uLockPrivilege
    19.         push    eax
    20.         call    dword ptr ebx
    21.         pop     ebx
    22.         or      eax,eax
    23.         jnz     NoCrash
    (посмотрел, вроде-бы setupapi делает тоже самое, что и первый вариант)
    Оба варианта работают, функция AllocateUserPhysicalPages дает нормальный результат. Проблема заключается в том, что это хозяйсво рабтает только в том случае, если в "Локальной политике" на "Lock Page in Memory" зарегестрирован я или группа администратора. Если там пусто, то оба варианта установки привелегий возвращают TRUE(точно не помню, первый вариант точно), но функция AllocateUserPhysicalPages дает ошибку.
    Конкретно - 1314 (ERROR_PRIVILEGE_NOT_HELD).
    Если убрать процедур включения привелегии, то будет возвращаться, кажется, 998 (ERROR_NOACCESS)

    Я бы обошелся, надо всего один раз ... но в WinXP SP2 "Lock Page in Memory" в 'Локальной политике' пустое и об'яснять каждому юзеру пойди_нажми_кнопку как-то не солидно.

    Может поможете лому? :)
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    /3GB в бут ини
    и
    IMAGE_FILE_LARGE_ADDRESS_AWARE equ 0020h в хидере исполняемого файла делают своё дело.
     
  3. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    asmfan, спасибо, вариант с 3G у меня и так работает. А если у юзера будет 8G (что уже не редкость), мне придется запускать два дополнительных процесса и их синхронизировать? А если будет 16G или 32? (программа на 1 месяц не пишется)
    Как-то не хочется делать из программы зверинец.
    У меня AWE работает, трудность только с регистрацией в локальной политике ... или я опять где-то лажанулся.
    В конференции я наталкивался на рекомендации использовать AWE для некоторых нужд, неужели все были вынуждены _руками_ регистрировать эту возможность? Честно говоря, как-то не верится для столь уважаемого форума.
    Потому и задал вопрос.
     
  4. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    И всё, вариантов нет?
    Жаль. [​IMG]
     
  5. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    А это не тот зверь, который через локальные политики управляется? Там вроде задаются пользователи\группы, которым можно эту операцию делать. Так по -умолчанию это только система может... Иля я не о том...
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    serj
    Если проблема только в этом, то дайте эту привилегию программно:
    Привилегия SeLockMemoryPrivilege с помощью функции LsaAddAccountRights. AFAIK без этой привилегии AWE использовать нельзя.
     
  8. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    asmfan, я видел этот пример, спасибо.

    Для включения AWE надо выполнить LoggedSetLockPagesPrivilege
    Остальные вещи понятны и недоразумений не вызывают.
    Код (Text):
    1. {
    2.   struct {
    3.     DWORD Count;
    4.     LUID_AND_ATTRIBUTES Privilege [1];
    5.   } Info;
    6.  
    7.   HANDLE Token;
    8.   BOOL Result;
    9.  
    10.   // Open the token.
    11.  
    12.   Result = OpenProcessToken ( hProcess,
    13.                               TOKEN_ADJUST_PRIVILEGES,
    14.                               & Token);
    15.  
    16.   if( Result != TRUE )
    17.   {
    18.     printf( "Cannot open process token.\n" );
    19.     return FALSE;
    20.   }
    21.  
    22.   // Enable
    23.  
    24.     Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
    25.  
    26.   // Get the LUID.
    27.  
    28.   Result = LookupPrivilegeValue ( NULL,
    29.                                   SE_LOCK_MEMORY_NAME,
    30.                                   &(Info.Privilege[0].Luid));
    31.  
    32.   if( Result != TRUE )
    33.   {
    34.     printf( "Cannot get privilege for %s.\n", SE_LOCK_MEMORY_NAME );
    35.     return FALSE;
    36.   }
    37.  
    38.   // Adjust the privilege.
    39.  
    40.   Result = AdjustTokenPrivileges ( Token, FALSE,
    41.                                    (PTOKEN_PRIVILEGES) &Info,
    42.                                    0, NULL, NULL);
    43.  
    44.   CloseHandle( Token );
    В моем варианте это:
    Код (Text):
    1. _EnablePrivilege proc
    2. local hToken:dword
    3.         pusha
    4. ;Try to open this process's access token
    5.       invoke    GetCurrentProcess
    6.       lea       ebx,hToken
    7.       invoke    OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES,ebx
    8. ;         // Attempt to modify the "Lock pages in Memory" privilege
    9.         mov     tp.PrivilegeCount, 1
    10.         lea     ecx,tp.Privileges[0].Luid
    11.         invoke  LookupPrivilegeValue,NULL, addr lpLockMem, ecx
    12. ;        mov     eax,tp.Privileges[0].Attributes ;old mode?
    13.         mov     tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
    14.         invoke  AdjustTokenPrivileges,hToken, FALSE, addr tp, sizeof tp, NULL, NULL
    15.         popa
    16.         ret
    17. _EnablePrivilege endp
    Я ошибся в переносе на asm?
     
  9. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    l_inc, спасибо, я посмотрю в эту сторону. :)
     
  10. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    [offtop]
    serj
    Ты случайно не этот serj? Тогда понятно, зачем тебе нужна работа с такими объемами памяти ;)
    [/offtop]
     
  11. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Если тот, то я был прав про Tjuction... ))
     
  12. serj

    serj New Member

    Публикаций:
    0
    Регистрация:
    27 сен 2005
    Сообщения:
    13
    l_inc, спасибо еще раз, всё обошлось. :)

    // особенно порадовали последние полтора часа, с пол второго до четырех, которые потребовались для прозрения - ба, а для применения нужен reboot!
    Это сейчас смешно ...
    :)