Мне надо получить доступ кбольшому количеству памяти и игры с /3GB не помогают. Решил попробовать AWE, вроде устраивает по функционалу, только возникли проблемы с привелегиями. Если я понял, надо получить права на "Lock Page in Memory". Пробовал два варианта: Code (Text): .data align 4 tp TOKEN_PRIVILEGES<> .code _EnablePrivilege proc local hToken:dword pusha invoke GetCurrentProcess lea ebx,hToken invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES,ebx mov tp.PrivilegeCount, 1 lea ecx,tp.Privileges[0].Luid invoke LookupPrivilegeValue,NULL, addr lpLockMem, ecx mov eax,tp.Privileges[0].Attributes mov tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,hToken, FALSE, addr tp, sizeof tp, NULL, NULL invoke CloseHandle,hToken popa ret _EnablePrivilege endp И через вызов setupapi. Code (Text): .data SetupDLL db "setupapi.dll",0 lpEnablePrivilege db "pSetupEnablePrivilege",0 uLockPrivilege dw SeLockMemoryPrivilege,0 .code invoke LoadLibrary,addr SetupDLL mov hEnablePrivilege,eax or eax,eax jz Crash0 invoke GetProcAddress,hEnablePrivilege,addr lpEnablePrivilege or eax,eax jz Crash1 push ebx mov ebx,eax mov eax,TRUE push eax mov eax,offset uLockPrivilege push eax call dword ptr ebx pop ebx or eax,eax jnz NoCrash (посмотрел, вроде-бы setupapi делает тоже самое, что и первый вариант) Оба варианта работают, функция AllocateUserPhysicalPages дает нормальный результат. Проблема заключается в том, что это хозяйсво рабтает только в том случае, если в "Локальной политике" на "Lock Page in Memory" зарегестрирован я или группа администратора. Если там пусто, то оба варианта установки привелегий возвращают TRUE(точно не помню, первый вариант точно), но функция AllocateUserPhysicalPages дает ошибку. Конкретно - 1314 (ERROR_PRIVILEGE_NOT_HELD). Если убрать процедур включения привелегии, то будет возвращаться, кажется, 998 (ERROR_NOACCESS) Я бы обошелся, надо всего один раз ... но в WinXP SP2 "Lock Page in Memory" в 'Локальной политике' пустое и об'яснять каждому юзеру пойди_нажми_кнопку как-то не солидно. Может поможете лому?
/3GB в бут ини и IMAGE_FILE_LARGE_ADDRESS_AWARE equ 0020h в хидере исполняемого файла делают своё дело.
asmfan, спасибо, вариант с 3G у меня и так работает. А если у юзера будет 8G (что уже не редкость), мне придется запускать два дополнительных процесса и их синхронизировать? А если будет 16G или 32? (программа на 1 месяц не пишется) Как-то не хочется делать из программы зверинец. У меня AWE работает, трудность только с регистрацией в локальной политике ... или я опять где-то лажанулся. В конференции я наталкивался на рекомендации использовать AWE для некоторых нужд, неужели все были вынуждены _руками_ регистрировать эту возможность? Честно говоря, как-то не верится для столь уважаемого форума. Потому и задал вопрос.
А это не тот зверь, который через локальные политики управляется? Там вроде задаются пользователи\группы, которым можно эту операцию делать. Так по -умолчанию это только система может... Иля я не о том...
serj Если проблема только в этом, то дайте эту привилегию программно: Привилегия SeLockMemoryPrivilege с помощью функции LsaAddAccountRights. AFAIK без этой привилегии AWE использовать нельзя.
asmfan, я видел этот пример, спасибо. Для включения AWE надо выполнить LoggedSetLockPagesPrivilege Остальные вещи понятны и недоразумений не вызывают. Code (Text): { struct { DWORD Count; LUID_AND_ATTRIBUTES Privilege [1]; } Info; HANDLE Token; BOOL Result; // Open the token. Result = OpenProcessToken ( hProcess, TOKEN_ADJUST_PRIVILEGES, & Token); if( Result != TRUE ) { printf( "Cannot open process token.\n" ); return FALSE; } // Enable Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the LUID. Result = LookupPrivilegeValue ( NULL, SE_LOCK_MEMORY_NAME, &(Info.Privilege[0].Luid)); if( Result != TRUE ) { printf( "Cannot get privilege for %s.\n", SE_LOCK_MEMORY_NAME ); return FALSE; } // Adjust the privilege. Result = AdjustTokenPrivileges ( Token, FALSE, (PTOKEN_PRIVILEGES) &Info, 0, NULL, NULL); CloseHandle( Token ); В моем варианте это: Code (Text): _EnablePrivilege proc local hToken:dword pusha ;Try to open this process's access token invoke GetCurrentProcess lea ebx,hToken invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES,ebx ; // Attempt to modify the "Lock pages in Memory" privilege mov tp.PrivilegeCount, 1 lea ecx,tp.Privileges[0].Luid invoke LookupPrivilegeValue,NULL, addr lpLockMem, ecx ; mov eax,tp.Privileges[0].Attributes ;old mode? mov tp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,hToken, FALSE, addr tp, sizeof tp, NULL, NULL popa ret _EnablePrivilege endp Я ошибся в переносе на asm?
[offtop] serj Ты случайно не этот serj? Тогда понятно, зачем тебе нужна работа с такими объемами памяти [/offtop]
l_inc, спасибо еще раз, всё обошлось. // особенно порадовали последние полтора часа, с пол второго до четырех, которые потребовались для прозрения - ба, а для применения нужен reboot! Это сейчас смешно ...