ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

19.11.2008, 02:04
|
|
Познающий
Регистрация: 22.07.2008
Сообщений: 62
Провел на форуме: 304390
Репутация:
172
|
|
Полный путь до процесса? до твоего test.exe
Добавлено: если, что его не сюда постить надо было, а вставить в код и попробывать скомпилить.
Код:
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
CreateProcess(L"C:\\Program Files\\TEST\\test.exe", L"-x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
ExitProcess(0);
Последний раз редактировалось _Kris_; 19.11.2008 в 02:32..
|
|
|

19.11.2008, 02:15
|
|
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме: 2364957
Репутация:
479
|
|
Я так уже пробовал, не получилось.
проблему решил.
CreateProcess(L"test.exe", L"test.exe -x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
Последний раз редактировалось ntldr; 19.11.2008 в 14:52..
|
|
|

19.11.2008, 15:41
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме: 811764
Репутация:
119
|
|
А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
|
|
|

19.11.2008, 16:26
|
|
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме: 2364957
Репутация:
479
|
|
Сообщение от criz
А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
я знаю, но таким способом у меня почему-то не запускалось вообще
|
|
|

19.11.2008, 20:21
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме: 811764
Репутация:
119
|
|
Сообщение от ntldr
я знаю, но таким способом у меня почему-то не запускалось вообще
Попробуй вызвать GetLastError(), может узнаешь в чем проблема.
|
|
|

19.11.2008, 22:08
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме: 4275992
Репутация:
1188
|
|
передача массива в DLL
постановка задачи: нужно было с функции передать в DLL библиотеку значения А, В, С, и т.д. и одномерный массив для вычисления функции, библиотека возвращает результат операции или же код ошибки (тоже результат 666).
реализация:
глобальные переменные
Код:
int mas[5];
int el, g;
int m_a[5], m_b[5],m_c[5],m_matrix[80];
int Number;
int am,bm,cm;
Функция RUN
Код:
void CMyFrameWin::OnRun()
{
char sq[80];
FILE *read;
read=fopen("matrix.txt","r");
while(!feof(read)){
for(int g=0;g<5;g++)
{
fscanf(read,"%d",&el);
mas[g]=el;
fscanf(read,"\n");
sprintf(sq,"%d", mas[g]);
MessageBox(sq,"ELEMENT MASIVA"); // проверка елементов
}
}
int res;
HINSTANCE hDll;
char s[100];
hDll=::LoadLibrary("MyDll");
if (hDll == NULL)
{
::MessageBox(NULL,"ERROR","ERROR! File MyDll.dll not found!",MB_OK| MB_ICONSTOP);
}
else
{
typedef int (*FUN)(int*,int,int,int,int);
FUN func;
func=(FUN)::GetProcAddress(hDll, "calc");
res=(*func)(mas,Number,am,bm,cm);
if (res==666)
{
::MessageBox(NULL,"ERROR! ","DATA ERROR!",MB_OK| MB_ICONSTOP);
}
else
{ sprintf(s,"%d", res);
MessageBox(s,"Result");
//создание и запись результата в файл
FILE *result;
result=fopen("result.txt","w");
fprintf(result,"%d",res);
fclose(result);
}
::FreeLibrary(hDll);
}
массив заполняется значениями из файла matrix.txt вида :
и собственно сама dll - ка
Код:
#include "stdafx.h"
#include <conio.h>
int calc ( int *mas, int Number, int am, int bm, int cm)
{
int r=Number;
int a=am,b=bm,c=cm,n=5,resalt;
//int mas[5]={0,1,2,3,4};
if(r==9){
_asm{
mov eax,0
mov ecx,n
lea esi,mas
l1:
add eax,[esi]
add esi,4
loop l1
add eax,c
mov resalt,eax
}}
else if(r<=5){
_asm{
mov eax,a
sub eax,c
mov a,eax
mov eax,b
mul b
add eax,a
mov ebx,c
cdq
div ebx
mov resalt,eax
}}
else resalt=666;
return resalt;
}
если массив не передавать а забить в dll типа так
//int mas[5]={0,1,2,3,4};
то dll - ка работает нормально, а массив передать никак не получается. В результате получаем хз что.. типа 343987428... и т.д.
кто разбирается посмотрите что там в коде не так... где то я втыкаю.. или у кого есть ссыль на хелп по передаче массива в dll буду рад почитать.
спасибо.
|
|
|

19.11.2008, 22:19
|
|
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
Провел на форуме: 1845671
Репутация:
1338
|
|
Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
|
|
|

19.11.2008, 22:25
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме: 4275992
Репутация:
1188
|
|
все билдится в Вижуал Студио 2008 с future pack - oм (хотя думаю фьюче пак не при чем)
|
|
|

19.11.2008, 22:48
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме: 127017
Репутация:
61
|
|
Сообщение от GlOFF
Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
ни один компилятор СИ не генерирует массив таким образом как вы сказали
То что вы сказали относится к динамическим спискам. Массивы всегда последовательно располагаются в памяти. На этом свойстве массивов основана адресация по указателю.
|
|
|

20.11.2008, 02:05
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме: 4275992
Репутация:
1188
|
|
значить вот такая история с подключением dll..
сначала когда массив задавался в самой библиотеке
(int mas[5]={0,1,2,3,4}  все работало без претензий при любом значении int Number, int am, int bm, int cm всегда получали правильное решение.
библиотека выглядела так:
Код:
#include "stdafx.h"
#include <conio.h>
int calc (int Number, int am, int bm, int cm)
{
int r=Number;
int a=am,b=bm,c=cm,n=5,resalt;
int mas[5]={0,1,2,3,4};
if(r==9){
_asm{
mov eax,0
mov ecx,n
lea esi,mas
l1:
add eax,[esi]
add esi,4
loop l1
add eax,c
mov resalt,eax
}}
else if(r<=5){
_asm{
mov eax,a
sub eax,c
mov a,eax
mov eax,b
mul b
add eax,a
mov ebx,c
cdq
div ebx
mov resalt,eax
}}
else resalt=666;
return resalt;
}
Другим цветом выделил часть кода которая работает с массивом.
потом массив я передал с другой функции, так как было описано ТУТ
для проверки корректности передачи элементов использовал вывод каждого
Код:
int calc ( int *mas, int Number, int am, int bm, int cm)
{
int r=Number;
int a=am,b=bm,c=cm,n=5,resalt;
char sdll[100] = {0};
sprintf(sdll,"%d", mas[1]);
MessageBoxA(NULL, sdll,"Result", NULL);
if(r==9){..........
тут все нормально. элементы массива корректно могут считываться и использоваться библиотекой.
но сам асм код который отвечает за обработку массива в результат кидал постоянно значения типа 3645435664 или 8764599943.....
вышел с положения только С++ кодом...
Код:
if(r==9){
int temp=0;
for(int i=0;i<n;i++)
{
temp=temp+mas[i];
}
resalt=cm +temp ;
}
так и не понял почему предыдущий РАБОТАЮЩИЙ асм код для массива который был обьявлен внутри dll не покатил для массива который передаем из другой функции...
а нужно именно асм код..
трабла в адресации памяти? или хз?
кто что посоветует?
спасибо.
-------------------EDIT---------------------------
решение проблемы - пост от bons.
bons, спасибо.
-------------------EDIT---------------------------
Последний раз редактировалось NetSter; 21.11.2008 в 19:38..
Причина: решение проблемы.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|