От:
justin9
Дата: 28.11.06 10:32
Оценка:
Здравствуйте.
У меня возникла проблема с данной функцией, вроде как и вызываю правильно и всёравно БСОД. Помогите пожалуйста.
HANDLE hProcessHandle;
ACCESS_MASK DesiredAccess = PROCESS_TERMINATE;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
ObjectAttributes.Length = 0x18;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
ClientId.UniqueProcess = 2345;/*тут я ставлю PID существующего процесса*/
ClientId.UniqueThread = 0;
ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);
пробовал любые варианты, всёравно БСОД(((
отладчиком пользоваться не могу т.к. на двухядернике айс чтото не очень хочет работать...
Заранее Спасибо.
29.11.06 13:22: Перенесено модератором из 'C/C++' — Кодт
Re: проблема с ZwOpenProcess
Некорректная инициализация ObjectAttributes: см пример
/*
ибо:
#define InitializeObjectAttributes( p, n, a, r, s ) { \
(p)->Length = sizeof( OBJECT_ATTRIBUTES ); \
(p)->RootDirectory = r; \
(p)->Attributes = a; \
(p)->ObjectName = n; \
(p)->SecurityDescriptor = s; \
(p)->SecurityQualityOfService = NULL; \
*/
BOOLEAN KillProcess(ULONG PID)
{
OBJECT_ATTRIBUTES objectAttributes;
CLIENT_ID clientID;
HANDLE hProcess=NULL;
NTSTATUS status;
InitializeObjectAttributes( &objectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL );
clientID.UniqueProcess = (HANDLE)PID;
clientID.UniqueThread = NULL;
status = ZwOpenProcess( &hProcess,
PROCESS_TERMINATE,
&objectAttributes, &clientID );
if (!NT_SUCCESS(status))
{
return FALSE;
}
status = ZwTerminateProcess(hProcess, 0);
ZwClose(hProcess);
return TRUE;
}
J>Здравствуйте.
J>У меня возникла проблема с данной функцией, вроде как и вызываю правильно и всёравно БСОД. Помогите пожалуйста.
J>
J>HANDLE hProcessHandle;
J>ACCESS_MASK DesiredAccess = PROCESS_TERMINATE;
J>OBJECT_ATTRIBUTES ObjectAttributes;
J>CLIENT_ID ClientId;
J>ObjectAttributes.Length = 0x18;
J>ObjectAttributes.RootDirectory = 0;
J>ObjectAttributes.ObjectName = 0;
J>ObjectAttributes.Attributes = 0;
J>ObjectAttributes.SecurityDescriptor = 0;
J>ObjectAttributes.SecurityQualityOfService = 0;
J>ClientId.UniqueProcess = 2345;/*тут я ставлю PID существующего процесса*/
J>ClientId.UniqueThread = 0;
J>ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);
J>
J>пробовал любые варианты, всёравно БСОД(((
J>отладчиком пользоваться не могу т.к. на двухядернике айс чтото не очень хочет работать...
J>Заранее Спасибо.
Viva el Junta Militar! Viva el Presidente!
Re[2]: проблема с ZwOpenProcess
От:
justin9
Дата: 30.11.06 08:35
Оценка:
Здравствуйте, Ligen,
Спасибо за ответ, но он мне не помог
из ринг3 мой код работает на ура, а из ринг0 — бсод...
уже что только не перепробовал!
может проблема в инициализации драйвера? но вроде всё сделал по примерам и правильно...
Re[3]: проблема с ZwOpenProcess
Какой код bugcheck'a?
Подозрения на то, что вы запускаете его не на PASSIVE_LEVEL, например, где-то до этого захватываете Spinlock.
Возьмите пример, например
сампл Солдатова и добавьте свой код на обработку IRP_MJ_DEVICE_CONTROL.
И возьмите лучше WinDbg для отладки, много удобнее.
J>Здравствуйте, Ligen,
J>Спасибо за ответ, но он мне не помог
J>из ринг3 мой код работает на ура, а из ринг0 — бсод...
J>уже что только не перепробовал!
J>может проблема в инициализации драйвера? но вроде всё сделал по примерам и правильно...
Viva el Junta Militar! Viva el Presidente!
Re[4]: проблема с ZwOpenProcess
От:
justin9
Дата: 01.12.06 15:32
Оценка:
код у меня обычный, без каких либо обработок.
так скаать простейший драйвер
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT deviceObject = NULL;
UNICODE_STRING deviceNameUnicodeString;
UNICODE_STRING deviceLinkUnicodeString;
DbgPrint("123.SYS: Loading Driver . . .\n");
RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
Status = IoCreateDevice(DriverObject, 0,
&deviceNameUnicodeString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&deviceObject);
if (NT_SUCCESS(Status))
{
RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
Status = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
if (!NT_SUCCESS(Status)) DbgPrint("123.SYS: Error1\n");
DriverObject->DriverUnload = Unload;
}
if (!NT_SUCCESS(Status)) DbgPrint("123.SYS: Error2\n");
if (NT_SUCCESS(KillProcess(4004))) // тут бсод
DbgPrint(("OKKKKKK\n")); else DbgPrint(("((((\n"));
return Status;
}
Re[5]: проблема с ZwOpenProcess
От:
justin9
Дата: 01.12.06 17:51
Оценка:
вроде DriverEntry выполняется на PASSIVE_LEVEL а всёравно глюки
Re[6]: проблема с ZwOpenProcess
От:
Аноним
Дата: 01.12.06 20:52
Оценка:
создал нить с процедурой KillProcess
теперь бсод не вылетает, вообще ничего не вылетает, ни ошибки и ничего вообще(
[code]
VOID KillProcess(PVOID pContext)
{
try
{
NTSTATUS ntTerminateStatus;
HANDLE hProcessHandle = NULL;
ACCESS_MASK DesiredAccess = PROCESS_ALL_ACCESS;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
ClientId.UniqueProcess = 2928;
ClientId.UniqueThread = 0;
if (!(fNtOpenProcess = FindFunc(FindNT(), "ZwOpenProcess"))) goto _exit;
if (!(fNtTerminateProcess = FindFunc(FindNT(),"ZwTerminateProcess"))) goto _exit;
DbgPrint("fNtOpenProcess: %X\n", fNtOpenProcess);
DbgPrint("fNtTerminateProcess: %X\n", fNtTerminateProcess);
//тут всё работаит
ntTerminateStatus = fNtOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);
//вылетает х.з. куда на этом месте, причём обработчик молчит
DbgPrint("ntTerminateStatus == %d\n", ntTerminateStatus);
if (ntTerminateStatus == STATUS_SUCCESS)
{
DbgPrint("OPENNNNNNNNNNPROCESSSSS OK\n");
ZwClose(hProcessHandle);
} else DbgPrint("Error OpenProcess\n");
} except (EXCEPTION_EXECUTE_HANDLER){DbgPrint("EXCEPTION_EXECUTE_HANDLER KillProcess\n");}
_exit:
PsTerminateSystemThread(STATUS_SUCCESS);
return;
}
[code]
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить