информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Вызов функции в Delphi 03.04.03 21:54  Число просмотров: 1296
Автор: Fighter <Vladimir> Статус: Elderman
<"чистая" ссылка>
Я извиняюсь если это уже есть в нитке, но у меня сегодня канал постоянно падает, поэтому дальше я не полез. Внешние процедуры вызываются так:
procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'
или так:
function OpenThread(dwDesiredAccess: Longword; bInheritHandle: BOOL; dwThreadId: Longword): THandle; stdcall; external 'Kernel32.dll';
может и еще что-то есть, но мне об этом неизвестно.
<programming>
[Win32] Вызов функции в Delphi 01.04.03 12:28  
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Доброе время суток!
Кто-нибудь сталкивался с функцией CreateProcessWithLogonW (она находится в advapi.dll)? Проблема в следующем... Мне необходимо вызвать ее из Delphi. Что я делаю: описываю ее прототип (нет ее в windows.dcu), и потом делаю ее вызов. В результате вылетает ошибка в либе ntdll.dll (Access violation at adress .... in module ntdll.dll. Read of adress....)/

ниже приведены исходнички
function CreateProcessWithLogonW(
  lpUsername: WideString;                 // user's name
  lpDomain: WideString;                   // user's domain
  lpPassword: WideString;                 // user's password
  dwLogonFlags: DWORD;                 // logon option
  lpApplicationName: WideString;          // executable module name
  lpCommandLine: WideString;               // command-line string
  dwCreationFlags: DWORD;              // creation flags
  lpEnvironment: WideString;               // new environment block
  lpCurrentDirectory: WideString;         // current directory name
  lpStartupInfo: windows.STARTUPINFO;       // startup information
  lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; external 'advapi32.dll';

.........

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
  Username, Domain, passwrd, CommandLine: WideString;
  Token: DWORD;//PHanndle
  start: windows.STARTUPINFO;
  proc_info: windows.PROCESS_INFORMATION;
begin
  Username:='User0';
  passwrd:='';
  CommandLine:='c:\winnt\system32\cscript.exe d:\Scripts\del_u.vbs >> user0.txt';
  if not CreateProcessWithLogonW(
           UserName,                 // user's name
           Domain,                   // user's domain
           Passwrd,                 // user's password
           0,                             // logon option
           '',                             // executable module name
           CommandLine,        // command-line string
           windows.CREATE_DEFAULT_ERROR_MODE,              // creation flags
           '',                            // new environment block
           '',                            // current directory name
           start,                     // startup information
           proc_info              // process information
  )then ShowMessage('ОБЛОМ :-(((');
end;

---

ошибка вылазит при вызове ф-ии.
Кто-нибудь сталкивался с подобной проблемой?
заранее сенькс.
[Win32] Вызов функции в Delphi 03.04.03 21:54  
Автор: Fighter <Vladimir> Статус: Elderman
<"чистая" ссылка>
Я извиняюсь если это уже есть в нитке, но у меня сегодня канал постоянно падает, поэтому дальше я не полез. Внешние процедуры вызываются так:
procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'
или так:
function OpenThread(dwDesiredAccess: Longword; bInheritHandle: BOOL; dwThreadId: Longword): THandle; stdcall; external 'Kernel32.dll';
может и еще что-то есть, но мне об этом неизвестно.
Есть еще LoadLibrary и GetProcAddress 03.04.03 22:16  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
на C это делаю так 01.04.03 15:22  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
PROCESS_INFORMATION pi;
STARTUPINFOW siw;
memset(&siw,0,sizeof(siw));
siw.cb=sizeof(siw);

MultiByteToWideChar(CP_ACP,0,domm,-1,dom,256);//это чтобы в unicode
MultiByteToWideChar(CP_ACP,0,usrm,-1,usr,256);
MultiByteToWideChar(CP_ACP,0,pasm,-1,pas,256);
MultiByteToWideChar(CP_ACP,0,cmdm,-1,cmd,256);

CreateProcessWithLogonW(usr,dom,pas,1,0,cmd,0x400,0,0,&siw,&pi);

и работает.
Забыт stdcall 01.04.03 15:18  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 01.04.03 15:19  Количество правок: 1
<"чистая" ссылка>
Нужно чуть-чуть поправить:
function CreateProcessWithLogonW(
  lpUsername: WideString;                 // user's name
  lpDomain: WideString;                   // user's domain
  lpPassword: WideString;                 // user's password
  dwLogonFlags: DWORD;                 // logon option
  lpApplicationName: WideString;          // executable module name
  lpCommandLine: WideString;               // command-line string
  dwCreationFlags: DWORD;              // creation flags
  lpEnvironment: WideString;               // new environment block
  lpCurrentDirectory: WideString;         // current directory name
  lpStartupInfo: windows.STARTUPINFO;       // startup information
  lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; stdcall; external 'advapi32.dll';

---
И вот еще 02.04.03 10:24  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 02.04.03 10:25  Количество правок: 1
<"чистая" ссылка>
Не обратил внимания, нужно не WideString, а PWideChar и при вызове делать явное преобразование PWideChar(Text). Компилятор все сделает сам.
CreateProcessWithLogonW(
  lpUsername: PWideChar;		  // user's name
  lpDomain: PWideChar; 		  // user's domain
  lpPassword: PWideChar;		  // user's password
  dwLogonFlags: DWORD;		          // logon option
  lpApplicationName: PWideChar;	  // executable module name
  lpCommandLine: PWideChar;	  // command-line string
  dwCreationFlags: DWORD;	          // creation flags
  lpEnvironment: PWideChar;	  // new environment block
  lpCurrentDirectory: PWideChar;	  // current directory name
  lpStartupInfo: windows.STARTUPINFO;	  // startup information
  lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; stdcall; external 'advapi32.dll';

---
И вот еще 02.04.03 10:50  
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
Отредактировано 02.04.03 11:29  Количество правок: 1
<"чистая" ссылка>
> ): boolean; stdcall; external
> 'advapi32.dll';

а разве имеет значение в каком порядке следуют
stdcall; и external?

и еще такой вопрос...
Кто-нибудь пытался запустить одну и ту же прогу от имени нескольких разных пользователей? Скажем в системе есть 100 пользователей с именами User1..User100. От имени каждого из них надо запустить прогу с некоторыми входными параметрами...
У кого-нибудь был опыт решения подобных задач? поделитесь плз.
И вот еще 02.04.03 11:45  
Автор: Sandy <Alexander Stepanov> Статус: Elderman
<"чистая" ссылка>
> а разве имеет значение в каком порядке следуют
> stdcall; и external?

Порядок значения не имеет

> и еще такой вопрос...
> Кто-нибудь пытался запустить одну и ту же прогу от имени
> нескольких разных пользователей? Скажем в системе есть 100
> пользователей с именами User1..User100. От имени каждого из
> них надо запустить прогу с некоторыми входными
> параметрами...
> У кого-нибудь был опыт решения подобных задач? поделитесь
> плз.

Может быть сделать батник и через RunAs...
И вот еще 02.04.03 13:07  
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > а разве имеет значение в каком порядке следуют
> > stdcall; и
> external?
>
> Порядок значения не имеет
>
Вот только что попробовал поменять их местами.... Оказалось что ворядок имеет значение....
И вот еще 02.04.03 13:37  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
Порядок определяется синтаксисом Delphi.

И еще, вот это
CommandLine:='c:\winnt\system32\cscript.exe d:\Scripts\del_u.vbs >> user0.txt';
- не сработает.

Если нужно сделать перенаправление в файл, то запускай cmd.exe
Или перенаправь выход ручками.
Если оставить как есть, но cscript.exe просто получит три параметра 'd:\Scripts\del_u.vbs', '>>' и 'user0.txt'.
И вот еще 02.04.03 13:41  
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> И еще, вот это
> CommandLine:='c:\winnt\system32\cscript.exe
> d:\Scripts\del_u.vbs >> user0.txt';
> - не сработает.
>
> Если нужно сделать перенаправление в файл, то запускай
> cmd.exe
> Или перенаправь выход ручками.
> Если оставить как есть, но cscript.exe просто получит три
> параметра 'd:\Scripts\del_u.vbs', '>>' и
> 'user0.txt'.
Да тут не играет роли что выполнять, главное как это будет выполняться....
Но все равно спасибо за совет
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach