Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
#1

Модуль-посредник для wtsapi32.dll - C++

26.01.2012, 23:57. Просмотров 1726. Ответов 6
Метки нет (Все метки)

Здравствуйте. Вот пытаюсь написать модель-посредник для wtsapi32.dll. Судь заключается в том, что этот модуль заменяет оригинальный и просто перенаправляет все на оригинальный функции.
При написании функции-посредника WTSEnumerateSessionsW я столкнулся с проблемой. Результат выполнения равен 0. Эта функция перечисляет сессии в диспетчере задач. Если я заменю библиотеку на свою, то список вообще исчезает.
Вот отрывок из кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <stdlib.h>
#include "wtsapi32.h"
 
#pragma argsused
typedef BOOL (WINAPI *WTSENUMERATESESSIONSW)(HANDLE, DWORD, DWORD, PWTS_SESSION_INFOW*, DWORD*);
 
extern "C" __declspec(dllexport) BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOW *ppSessionInfo, DWORD *pCount);
 
 
HMODULE hLib = LoadLibrary("wtsapi1.dll");// Оригинальная библиотека
 
BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOW *ppSessionInfo, DWORD *pCount)
{
    BOOL ret;
    WTSENUMERATESESSIONSW Orig;
 
    Orig = (WTSENUMERATESESSIONSW)GetProcAddress(hLib, "WTSEnumerateSessionsW");
 
    ret = Orig(hServer, Reserved, Version, ppSessionInfo , pCount);
 
    return ret;
}
Параметры ppSessionInfo , pCount не меняются. Почему?
Описание функции WTSEnumerateSessions (MSDN)
Спасибо.

Добавлено через 11 часов 31 минуту
Актуально

Добавлено через 12 часов 1 минуту
Подъем
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Модуль-посредник для wtsapi32.dll (C++):

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Для чего используется DLL? - C++
исходники кода написанного на C++ хранятся в DLL верно?? Для чего используется DLL?? Добавлено через 2 минуты вернее не исходники а...

DLL для Windows Mobile - C++
Всем добрый день. Такая проблема: есть библиотека DLL, которая была написана для десктопных приложений. Необходимо преобразовать ее в...

Библиотеки для работы с джейсоном, не требующие dll - C++
Судя по всему, jsoncpp что я пытался использовать обязует таскать с собой лишнюю длл, что меня совершенно не устраивает. Можно как-нибудь...

При компиляции DLL-проекта не создается DLL-ка - C++
Добрый день. создал в Visual Studio 2010 проект C+= типа DLL. В файл dllmain.cpp вставил вот такой код: // test.cpp: определяет...

Windows I/o без Kernel32.dll и Advapi32.dll - C++
Добрый день. Необходимо в Windows XP SP3 распечатать в стандартный поток &quot;some text here&quot; без прямого или косвенного использования...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 00:05 #2
При написании функции-посредника WTSEnumerateSessionsW я столкнулся с проблемой. Результат выполнения равен 0
Что это значит? Результат, который у вас в переменную ret кладется или другой?

Если я заменю библиотеку на свою, то список вообще исчезает.
А это что значит? Какая своя библиотека? Какой список откуда исчезает?
1
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
27.01.2012, 00:26  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
Что это значит? Результат, который у вас в переменную ret кладется или другой?


А это что значит? Какая своя библиотека? Какой список откуда исчезает?
Я пытаюсь написать библиотеку, которая заменяет собой оригинальную (wtsapi32.dll). Она содержит те же самые функции и просто выполняет аналоги из оригинальной библиотеки, которую я загружаю через LoadLibrary и получаю адреса через GetProcAddress. Вот скриншот проблемы:

Модуль-посредник для wtsapi32.dll

Добавлено через 3 минуты
При этом функция возвращает true, что верно. GetLastErro молчит. Мне кажется, что в оригинальной функции не заполняется структура PWTS_SESSION_INFO. Почему? Я же верно передаю параметры

Добавлено через 1 минуту
OllyDbg-ом проверял, параметры передаются верно, как и в оригинале. Может ли это быть потому, что я не все функции реализовал в своей библиотеке?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 00:40 #4
ну похоже в вашем случае проблемы начинающих отпадают. просто с ходу вам врятли ответят, если с этим не имели дело. Нужно исследовать.
То, что вы не все ф-ии определили - это запросто может повлиять. Ведь не факт что список заполняется по результатом вызова ф-ии, которую вы тут привели. Или это факт?
Я так понял вы свою дллку написали и подсунули вместо родной. И какой-то процесс подхватывает вашу. Так чтоли? А как ваша не конфликтует с родной? имена поменяли?
Может где-то какие-то логи есть в которых можно попробовать что-то полезное найти.
Можно так же попробовать позапускать какую-нибудь другую тулзу, которая тоже использует то апи, которо вы подменили, procexp какой-нибудь или что-то типа того. как они себя ведут? может быть они начнут ругаться как-то на то, что в подмененной дллке чего-то не хватает.

В общем вам лучше в какой нибудь профильный форум с этим вопросом переехать.
1
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
27.01.2012, 00:52  [ТС] #5
Цитата Сообщение от DU Посмотреть сообщение
ну похоже в вашем случае проблемы начинающих отпадают. просто с ходу вам врятли ответят, если с этим не имели дело. Нужно исследовать.
То, что вы не все ф-ии определили - это запросто может повлиять. Ведь не факт что список заполняется по результатом вызова ф-ии, которую вы тут привели. Или это факт?
Я так понял вы свою дллку написали и подсунули вместо родной. И какой-то процесс подхватывает вашу. Так чтоли? А как ваша не конфликтует с родной? имена поменяли?
Может где-то какие-то логи есть в которых можно попробовать что-то полезное найти.
Можно так же попробовать позапускать какую-нибудь другую тулзу, которая тоже использует то апи, которо вы подменили, procexp какой-нибудь или что-то типа того. как они себя ведут? может быть они начнут ругаться как-то на то, что в подмененной дллке чего-то не хватает.
Вы все верно написали. Диспетчер задач как раз юзает апи этой библиотеки.

Либы не конфликтуют. На счет недостающих, я думаю, что оригинальная либа сама будет искать их в своем коде, уверен на 90%, но попробую дописать более-менее важные. После замены, мою библиотеку начинают использовать все процессы, которым она нужна, и сообщения о нехватке чего-то выскакивает автоматом.
0
antielvis
Сообщений: n/a
16.03.2014, 01:23 #6
Тоже так не получается. Добавил несколько функций WTSEnumerateSessionsA, WTSQuerySessionInformationW, WTSQuerySessionInformationA, WTSOpenServerA, WTSOpenServerW и WTSFreeMemory. Всё равно пустой список. Хотел отдебажить диспетчер в Ольке, но она впадает в ступор, т.к. это окно постоянно обновляется. Fusix, что-нибудь получилось? Структура PWTS_SESSION_INFO по идеи должна заполянться непосредственно в диспетчере.
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
16.03.2014, 01:31  [ТС] #7
Получилось. Но я уже забыл, что да как. Напиши в вк, вышлю исходники, если найду. id811441
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 01:31
Привет! Вот еще темы с ответами:

Модуль для Rad Studio типа VAssist для Visual Studio - C++ Builder
Здравствуйте. Подскажите, какую программку установить для подсветки синтаксиса и всплывающих подсказок?

c++ dll для .net framework c# - C++ Builder
Добрый день. Есть программа, написанная в c++ builder'e, так же есть исходный код её. Хочу использовать её возможности в своем...

Создать модуль DLL-модуль с классом, позволяющим запускать внешнюю программу - C#
Как же все таки создать модуль DLL-модуль с классом, позволяющим запускать внешнюю программу. На многих форумах да и здесь находил код: ...

DLL модуль - Delphi
Всем доброе утро. Есть программа которая отправляет с помощью логина и пароля от почты маила смс, но программа разбита на две части. как из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.03.2014, 01:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru