1)vb
2)Правда то что vb.Net догоняет по всем параметрам Delphi и c++
3)это вопрос!
Делфи и Бейсик ничто перед C
Добавлено через 1 час 24 минуты Недавно был вопрос, о том как работает Parallel.For Топик удален, но соображения свои, пожалуй, выложу.
Если вас интересует, какие процессы будут протекать в программе,
То могу предположить,
что создаются и запускаются нити(=потоки, нитями начали называть из-за дословного перевода англ. Thread - нить))
, в каждой из которых выполняются действия, определенные вами в делегате,
который передается функции For. Вполне логично что каждый поток соответствует некоторой итерации(шагу) цикла.
Далее, исходя из того, что PLINQ разрабатывали крутые ребята из мелкософта,
думаю они обустроили и распределение итераций на поток,
поскольку процессоры сейчас хоть и многоядерные, но ресурсы все же небезграничны.
То-бишь службы интегрированных запросов должны подсчитать сколько потоков они могут запустить без ущерба,
распределить итерации между этими потоками, тогда в каждом потоке последовательно выполнится по несколько шагов.
Ну и с потоковой безопасностью они что нибудь должны были запилить, дабы заботливо избавить программеров от ексепшенов,
к примеру по поводу доступа к контролам из левых нитей)
Конкретно в вашем случае, параллельные запросы можно было бы заменить так:
•Допустим мы уже написали класс для работы с сокетами - sock, в нем есть функция:
__•отправка - Send(string host, byte[] message, int endPort, int localPort, Action onResponse);
__//первый аргумент - адрес хоста, второй - передаваемый буффер, третий - порт на конечном узле, четвертый - порт на который к нам придет ответ,
__//ну и последний - делегат кэллбэка, действия выполняемого при получении ответа.
•Ну и еще чуть-чуть напряжем фантазию, и представим что есть у нас лист массивов байтов - List<byte[]> messages, которые мы и будем перебирать.
•Определять свободные процессоры мы не будем, и распределять между ними действия тоже, просто переберем массив, что бы казаться умнее скажу - асинхронно).
•Еще каплю воображения - пусть будет у нас глобальная переменная типа int с именем port)
•Ну и есть у нас собственно функция отправки сих сообщений:
Как вы могли заметить для создания делегата я использую LINQ, но,
что бы полностью заменить интегрированные запросы можно изменить в коде LINQ выражение
(/*arguments*/) => {/*actions*/} следующим образом:
•
__•Создать функции:
Код:
public void _addToList(string str)
{
ListBox1.Items.Add(str);
}
public void _callBack(string result){
this.BeginInvoke(addToList(result));
}
__•И объявить прототипы и делегаты:
Код:
public delegate void PCallBack(string result);
public delegate void PAddToList(string str);
PCallBack callBack;
PAddToList addToList;
__•Проинициализировать их в конструкторе:
Код:
callBack = _callBack;
addToList = _addToList;
__•Вместо LINQ выражений передавать созданные выше делегаты
•
__•Воспользоваться т.н. анонимными методами, имеющими конструкцию delegate() {}, довольно схожую с LINQ выражением () => {}; Точно также, как ранее в интегрированных запросах, в круглых скобках указываем аргументы, в фигурных выполняем какие-либо действия
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой
Последний раз редактировалось •theSaboteur•; 13.11.2011 в 18:04.
Причина: Добавлено сообщение
Здравствуйте,
Гугл молчит в отношении того как изменить значение с помощью VAMemory на шарпе, по адресу: client.dll+6F42F0 в определенном процессе. Кто нибудь знает?
Здравствуйте,
Гугл молчит в отношении того как изменить значение с помощью VAMemory на шарпе, по адресу: client.dll+6F42F0 в определенном процессе. Кто нибудь знает?
Вместо WriteByte используешь функцию соответствующую твоему типу данных. Если узаешь какой-то кастомный - переводи в байты и пиши функцией WriteByteArray(); •Прототип функций этой библиотеки
public VAMemory();
public VAMemory(string pProcessName);
public long getBaseAddress { get; }
public string processName { get; set; }
public bool CheckProcess();
public bool ReadBoolean(IntPtr pOffset);
public byte ReadByte(IntPtr pOffset);
public byte[] ReadByteArray(IntPtr pOffset, uint pSize);
public char ReadChar(IntPtr pOffset);
public double ReadDouble(IntPtr pOffset);
public float ReadFloat(IntPtr pOffset);
public short ReadInt16(IntPtr pOffset);
public int ReadInt32(IntPtr pOffset);
public long ReadInt64(IntPtr pOffset);
public int ReadInteger(IntPtr pOffset);
public long ReadLong(IntPtr pOffset);
public short ReadShort(IntPtr pOffset);
public string ReadStringASCII(IntPtr pOffset, uint pSize);
public string ReadStringUnicode(IntPtr pOffset, uint pSize);
public ushort ReadUInt16(IntPtr pOffset);
public uint ReadUInt32(IntPtr pOffset);
public ulong ReadUInt64(IntPtr pOffset);
public uint ReadUInteger(IntPtr pOffset);
public long ReadULong(IntPtr pOffset);
public ushort ReadUShort(IntPtr pOffset);
public bool WriteBoolean(IntPtr pOffset, bool pData);
public bool WriteByte(IntPtr pOffset, byte pData);
public bool WriteByteArray(IntPtr pOffset, byte[] pBytes);
public bool WriteChar(IntPtr pOffset, char pData);
public bool WriteDouble(IntPtr pOffset, double pData);
public bool WriteFloat(IntPtr pOffset, float pData);
public bool WriteInt16(IntPtr pOffset, short pData);
public bool WriteInt32(IntPtr pOffset, int pData);
public bool WriteInt64(IntPtr pOffset, long pData);
public bool WriteInteger(IntPtr pOffset, int pData);
public bool WriteLong(IntPtr pOffset, long pData);
public bool WriteShort(IntPtr pOffset, short pData);
public bool WriteStringASCII(IntPtr pOffset, string pData);
public bool WriteStringUnicode(IntPtr pOffset, string pData);
public bool WriteUInt16(IntPtr pOffset, ushort pData);
public bool WriteUInt32(IntPtr pOffset, uint pData);
public bool WriteUInt64(IntPtr pOffset, ulong pData);
public bool WriteUInteger(IntPtr pOffset, uint pData);
public bool WriteULong(IntPtr pOffset, ulong pData);
public bool WriteUShort(IntPtr pOffset, ushort pData);
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой
Последний раз редактировалось •theSaboteur•; 13.11.2011 в 22:39.
"VAMemory" не содержит определения для "getBaseAdress" и не был найден метод расширения "getBaseAdress", принимающий тип "VAMemory" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Для getBaseAdress какие библиотеки нужны?
Тип значения у меня 4 байтный. У процесса engine.exe, есть адрес: client.dll+6F42F0, и надо сменить его значение...
"VAMemory" не содержит определения для "getBaseAdress" и не был найден метод расширения "getBaseAdress", принимающий тип "VAMemory" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Для getBaseAdress какие библиотеки нужны?
Тип значения у меня 4 байтный. У процесса engine.exe, есть адрес: client.dll+6F42F0, и надо сменить его значение...
Да, я несколько не верно понял вопрос, getBaseAddress (не помню как точно в этой библиотеке она пишется) возвращает базовый адресс процесса.
Соответственно тебе необходимо вместо него нужно впихнуть адрес этой либы.
Что бы его получить, можно узать IntPtr CreateToolhelp32Snapshot(0x00000008, PID);
Вызывать сие чуда из kernel32.dll
Собственно создаешь структуру MODULEENTRY32, перечисляешь все модули процесса с помощью Module32First Module32Next, проверяешь у каждого модуля поле szModule, пока не встретишь client.dll. У модуля client.dll читаешь поле modBaseAddress.
Далее просто пишешь по полученому адресу+6F42F0, то, что тебе требуется.
Более точно написать не могу - надо студию запускать, проверять... лень)
[Ссылки могут видеть только зарегистрированные пользователи. ]
===================
Нда.. Только что погуглил - оказывается майкрософт все сделал:
Хм, на 1 код он ругается, почему ретурн в ифе, когда должен возвращать значение getAddr(Process); ?
Во 2 случае он ругается на:
IntPtr addr = from item in proc.Modules
where item.ModuleName == "client.dll"
select item.BaseAddress;
- Неявное преобразование типа "System.Collections.Generic.IEnumerable<System.Int Ptr>" в "System.IntPtr" невозможно...
Человечек, да вам не чтение памяти нада, вам элементарные основы надо учить, если вы не можете сделать сами
1) элементарное приведение типов:
int res=25;
MessageBox.Show(res);//ошибка здесь будет так как типы не приведены!
2) return находится только в процедурах и должен возвращать приведенный тип данных!!!
string lol()
{
int res=5;
return res;//будет ошибка на непреведенный тип(правильно return res.ToString());
}
void lol()
{
///
return...//Всегда будет ошибка, так как неуправляемая функция не возвращает ничего!
}
Последний раз редактировалось Hermein; 14.11.2011 в 09:27.
2) return находится только в процедурах и должен возвращать приведенный тип данных!!!
string lol()
{
int res=5;
return res;//будет ошибка на непреведенный тип(правильно return res.ToString());
}
void lol()
{
///
return...//Всегда будет ошибка, так как неуправляемая функция не возвращает ничего!
}
Я это и имел ввиду, я знаю про воиды (static int\string etc.) достаточно.
Цитата:
Хм, на 1 код он ругается, почему ретурн в ифе, когда должен возвращать значение getAddr(Process); ?
Просто не совсем корректно сформулировал вопрос. В функции getAdr, ретурн не там, такой код верный:
PHP код:
IntPtr getAddr(Process process)
{
IntPtr test = (IntPtr)0x006F4274;
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName == "client.dll")
{
test = module.BaseAddress;
}
}
return test;
}
Он хоть ошибок не вызывает. Но я все равно никак не получается сделать чтобы он брал адресс типа: client.dll+0x*
Я не силен в редактировании памяти, только начал изучать в гугле, но там статьи с использованием VAMemory только для таких адресов, как: 0x* в моем случае client.dll+0x*, я не знаю как перевести адрес client.dll в формат 0x*, мне это не кажется возможным. (Convert.To*() - не катит)
Добавлено через 53 минуты
Если делать так:
Код:
IntPtr getAddr()
{
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("hl2.exe");
myProcess.StartInfo = myProcessStartInfo;
IntPtr test = (IntPtr)0x6F42F0;
foreach (ProcessModule module in myProcess.Modules)
{
if (module.ModuleName == "client.dll")
{
test = module.BaseAddress;
}
}
return test;
}
private void button1_Click(object sender, EventArgs e)
{
VAM = new VAMemory("hl2");
VAM.WriteByte(getAddr() + (IntPtr)0x6F42F0, 2);
}
Тогда он ругается на:
Оператор "+" не может применяться к операндам типа "System.IntPtr" и "System.IntPtr"
Как быть?
Добавлено через 1 час 47 минут
Самый оптимальный вариант, только он походу не ищет адрес длл-ки, или ищет но очень криво. Если раскоменитить:
Draiget, во-первых давайте не будем придираться к мелочам реализации.
Во-вторых client.dll переводить ни во что не надо.
Вам надо прочитать поле BaseAddress экземпляра класса ProcessModule,
соответствующего вашей client.dll.
То-бишь вы перебираете модули процесса, находите в нем тот страшный модуль,
поле которого ModuleName соответствует "client.dll",
адресом модуля будет содержимое поля BaseAddress! К нему вы просто добавляете нужный оффсет и читаете/пишете по этому адресу.
Написал небольшой, малость кривоватый пример:
[Ссылки могут видеть только зарегистрированные пользователи. ]
ВТ не выкладываю, поскольку это архив, да и исходники собственно говоря безвредны)
Добавлено через 11 минут
Да, и по поводу "криво ищет", вы это о чем? О том что указатель отображается в десятичной сс? И еще поправочка
Что-то вы насчет ретурн'ов замудрили, возвращать лучше сразу как найдешь модуль клиент.длл, к чему проходить лишние айтемы множества?
Код:
IntPtr getAddr(Process process)
{
IntPtr test = (IntPtr)0x006F4274;
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName == "client.dll")
{
return module.BaseAddress;
}
}
return IntPtr.Zero;
}
Ну а что касается сложения IntPtr, то это как раз "мелочи реализации", мне не хотелось включать студию, проверять код, поэтому я несколько опечатался) к Хэндлу(т.е. IntPtr) вполне можно прибавить обычный int (который собственно является оффсетом). А что бы все выглядело эдак по-красивому, ООП'шно, словом выпендрежно, можно написать IntPtr.Add(IntPtr pointer, int offset);
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой
Последний раз редактировалось •theSaboteur•; 15.11.2011 в 16:02.
Причина: Исправлена опечатка
Что-то вы насчет ретурн'ов замудрили, возвращать лучше сразу как найдешь модуль клиент.длл, к чему проходить лишние айтемы множества?
Код:
IntPtr getAddr(Process process)
{
IntPtr test = (IntPtr)0x006F4274;
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName == "client.dll")
{
return module.BaseAddress;
}
}
}
[/more]
Этот код не работает:
"Test.Form1.getAddr(System.Diagnostics.Process )": не все ветви кода возвращают значение
ИМХО ретурн кривой.
А так, спасибо за пример, вот только мне-бы это переделать в поиск процесса именно с именем "text.exe", и именно с модулем "client.dll", а так все прекрасно. Попробую сам нагуглить, но если поможете, напишите.
"Test.Form1.getAddr(System.Diagnostics.Process )": не все ветви кода возвращают значение
ИМХО ретурн кривой.
А так, спасибо за пример, вот только мне-бы это переделать в поиск процесса именно с именем "text.exe", и именно с модулем "client.dll", а так все прекрасно. Попробую сам нагуглить, но если поможете, напишите.
Господи.. После цикла надо вписать ретурн налл, или если я не ошибаюсь хэндл null принимать не способен, но можно просто возвратить 0)
Если этого не сделать - не удастся скомпилировать код, поскольку компилятор не будет "знать", что возвратить в случае если результат проверки отрицательный
т.е.
Код:
IntPtr getAddr(Process process)
{
IntPtr test = (IntPtr)0x006F4274;
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName == "client.dll")
{
return module.BaseAddress;
}
}
return (IntPtr)0;
}
Таким образом, сразу как цикл находит модуль client.dll,
функция возвращает значение и, соответственно, прекращает свою работу.
Если такой модуль не встречается, то после цикла возвращается нулевое значение)
В главном модуле твоей программы просто вызываешь эту функцию для определения адреса, проверяешь не равен-ли он нулю, и если адрес валидный пытаешься переписать память)
===============
added: 21:28 15.11.11
===============
Не успел отправить)..
===============
added: 21:38 15.11.11
===============
Мда.. Кто ж так репу загадил?).. И за что, хотелось бы выслушать вашу критику
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой
Последний раз редактировалось •theSaboteur•; 15.11.2011 в 21:45.
Причина: Добавлено сообщение
Так я отправляю свой запрос... но акк не создается...
Возможные ошибки:
1) Кодировка запроса (пробовал разные, не помогло, возможно что то не проверилось из за капчи)
2) сервер проверяет не только 1 запрос, а еще и куки который выдается на странице регистрации...
возможно что то упустил кроме этого...