Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Информационный Канал Subscribe.Ru


RusFAQ.ru: Win API

Выпуск № 005
от 23.08.2003, 01:10

Администратор:
Имя: Калашников О. А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 13
Отправлено ответов: 15
Активность: 115.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

BOLT
Статус: Профессиональный
Общий рейтинг: 171.67
URL: Начинающему программитсу: софт, примеры, документация, Assembler, C & C++.
Телефон: Три раза АУ!
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 10. Ранее работающая функция в W98 в XP перестала работать Public Function GetKeyValue(lPredefinedKey As... (ответов: 1)
Вопрос № 11. Привет, народ ! Написал прогу создания процесса в Windows по примеру из книги Г.Неббета "Window... (ответов: 1)

Вопросов: 2, ответов: 2


 Вопрос № 10

Ранее работающая функция в W98 в XP перестала работать
Public Function GetKeyValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)
' Возвращает значения записанные в ключе
Dim lRetVal As Long
Dim hKey As Long
Dim vValue As Variant
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)

Dim cch As Long
Dim lrc As Long
Dim lType As Long
Dim lValue As Long
Dim sValue As String
On Error GoTo QueryValueExError

'Определение размера и типа считываемых данных
lrc = RegQueryValueExNULL(hKey, sValueName, 0&, lType, 0&, cch)
If lrc <> ERROR_NONE Then lrc = -1
Select Case lType
'Для символьных
Case REG_SZ
sValue = String(cch, 0)
lrc = RegQueryValueExString(hKey, sValueName, 0&, lType, sValue, cch)
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch - 1)
Else
vValue = Empty
End If
'Для численных
Case REG_DWORD, 3
lrc = RegQueryValueExLong(hKey, sValueName, 0&, lType, lValue, cch)
If lrc = ERROR_NONE Then vValue = lValue

'остальные не поддержанные типы данных
Case Else
lrc = -1

End Select
QueryValueExExit:

GetKeyValue = vValue
RegCloseKey (hKey)
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function



'---------------------------------------------------------------
'-Registry API Declarations...
'---------------------------------------------------------------
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Public Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Public Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long

'---------------------------------------------------------------
'- Registry Api Constants...
'---------------------------------------------------------------
' Reg Data Types...
Const REG_SZ = 1 ' Unicode nul terminated string
Const REG_EXPAND_SZ = 2 ' Unicode nul terminated string
Const REG_Byte = 3 ' Unicode nul terminated string
Const REG_DWORD = 4 ' 32-bit number
' Reg Create Type Values...
Const REG_OPTION_NON_VOLATILE = 0 ' Key is preserved when system is rebooted
' Reg Key Security Options...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Const KEY_EXECUTE = KEY_READ
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL

' Reg Key ROOT Types...
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
' Return Value...
Const ERROR_SUCCESS = 0

Public Const ERROR_NONE = 0
Public Const ERROR_BADDB = 1
Public Const ERROR_BADKEY = 2
Public Const ERROR_CANTOPEN = 3
Public Const ERROR_CANTREAD = 4
Public Const ERROR_CANTWRITE = 5
Public Const ERROR_OUTOFMEMORY = 6
Public Const ERROR_INVALID_PARAMETER = 7
Public Const ERROR_ACCESS_DENIED = 8
Public Const ERROR_INVALID_PARAMETERS = 87
Public Const ERROR_NO_MORE_ITEMS = 259

'---------------------------------------------------------------
'- Registry Security Attributes TYPE...
'---------------------------------------------------------------
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type



Вопрос отправлен: 15.08.2003, 09:58
Отправитель: s-nix (s-nix@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает BOLT

Доброе время суток, s-nix!
Сэр, какая именно функция не
работает?
Да прибудет с тобой Великая Сила!
This message was created by EMan 1.4

Ответ отправлен: 16.08.2003, 20:22
Отправитель: BOLT


 Вопрос № 11

Привет, народ !
Написал прогу создания процесса в Windows по примеру из книги Г.Неббета "Windows NT/2000 Native Api Reference". Прикол только в том, что я писал свою прогу под XP. И там она работает. Попробовал запускать ее под Windows 2000, то получил ошибку : "Ошибка при инициализации приложения (0xc00000fd)" . Вроде как это означает переполнение стека.
Пробовал увеличить стек - бесполезно.
Пробовал убрать охраняемую область за стеком - программа больше не ругается, но процесс тоже не живет.
Как же так получается, что на XP-юше идет, а под 2000 не хочет? (когда книжка-то для NT/2000 и код моей проги при переносе с XP я неизменял)
Привожу код, хотя это есть в Неббете.В приведенном коде не все названия полей совпадают с Неббетовским примером, но они все соответствуют им (проверял не раз). Просто я когда доставал файл заголовков через Интернет(ntdll.h), то достал весь нужный мне файл только почастям и в итоге он получился немного другой.
dwCheck - переменная отслеживает результаты выполнения Zw-функций
sii - SectionImageInformation структура
STACK_INFO - то же самое что и USER_STACK у Неббета.
...
// Создаем стек пользовательского режима. Выделяем под него память и заполняем поля структуры стека.
STACK_INFO stack = {0};
ULONG n = sii.StackReserve;
dwCheck = (DWORD) ZwAllocateVirtualMemory(hProcess, &stack.AllocationBase, 0, &n, MEM_RESERVE, PAGE_READWRITE);
stack.StackBase = PCHAR(stack.AllocationBase) + sii.StackReserve;
stack.StackLimit = PCHAR(stack.StackBase) - sii.StackCommit;
n = sii.StackCommit + PAGE_SIZE;
PVOID p = PCHAR(stack.StackBase) - n;
dwCheck = (DWORD) ZwAllocateVirtualMemory(hProcess, &p, 0, &n, MEM_COMMIT, PAGE_READWRITE);
ULONG x;
n = PAGE_SIZE;
// Устанавливаем защиту страниц в конце фиксированной области стека.
dwCheck = (DWORD) ZwProtectVirtualMemory(hProcess, &p, &n, PAGE_READWRITE | PAGE_GUARD, &x);
Но если все работает в XP, то почему же в 2000 глючит?



Вопрос отправлен: 18.08.2003, 10:36
Отправитель: Бегемот

[Следующий вопрос >>] [Список вопросов]

Отвечает BOLT

Приветствую Вас, Бегемот!
Несколько вариантов:
1)> Просто я когда доставал файл заголовков через Интернет(ntdll.h), то достал весь нужный мне файл только почастям и в итоге он получился немного другой.
Может быть в этом и вся причина?
2)Может быть интерфейс функций в win2k и winXP немного различается. Посмотри, поддерживает ли этот ntdll.h вообще эти системы, может версия старая. Скорее всего этот заголовочный файл жестко привязан к версии ядра. Это мое мнение.
Да прибудет с тобой Великая Сила!
This message was created by EMan 1.5

Ответ отправлен: 18.08.2003, 19:35
Отправитель: BOLT



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (38)
C / C++ (31)
Perl (3)
Builder / Delphi (20)
Pascal (24)
Basic / VBA (12)
Java / JavaScript (9)
PHP (8)
Криптография (10)
WinAPI (16)
Пользователю
Windows 95/98/Me (47)
Windows NT/2000/XP (57)
"Железо" (43)
Поиск информации (25)
Администратору
Windows NT/2000/XP (29)
Linux / Unix (12)
Юристу
Гражданское право (10)
Семейное право (6)
Трудовое право (7)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное