ну всем как бы присутсвующим
» Вопросы по программированию на C/С++
конкретный вопрос :)
ну у вас же какие то соображения есть.
вот мне положим AVX на фиг не нужно - процессор не поддерживает, а в изучениях я на втором sse застрял, с другой стороны не пропомню ни единого случая чтоб мне .186 .286 директивы в серьез понадобились. так что 10 версией все таки логичнее пользоваться, масма в смысле
вот мне положим AVX на фиг не нужно - процессор не поддерживает, а в изучениях я на втором sse застрял, с другой стороны не пропомню ни единого случая чтоб мне .186 .286 директивы в серьез понадобились. так что 10 версией все таки логичнее пользоваться, масма в смысле
Здравствуйте, помогите разобраться;
Задание: Реализовать схему "оповещения" трех ожидающих потоков о помещении в очередь (произвольного формата) некоторого сообщения на основе объекта синхронизации "событие". Генерируют события в очередь два потока, которые имеют приоритет на уровень ниже, чем ожидающие. Посчитать среднее число обработанных каждым потоком сообщений. Очередь должна быть защищена критической секцией.
[more=Код моей программы]
Код: #include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hTimer;
HANDLE hIEvent[2];
HANDLE hOEvent[3];
HANDLE hThread[5];
LPDWORD lpThreadId[5];
int count, s[3];
int arr[10];
RTL_CRITICAL_SECTION cs;
DWORD hTimerWait;
const LARGE_INTEGER *li;
void LastErrorMessage(int LastErrorCode){
cout << "Error Code: " << LastErrorCode << endl;
return;
}
DWORD InputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=1;
cout << "InputThread 1: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[0]);
}
return true;
}
DWORD InputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=2;
cout << "InputThread 2: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[1]);
}
return true;
}
DWORD OutputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 1: " << arr[count] << endl;
arr[count]=0;
count--;
s[0]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[0]);
}
return true;
}
DWORD OutputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 2: " << arr[count] << endl;
arr[count]=0;
count--;
s[1]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[1]);
}
return true;
}
DWORD OutputThread3(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 3: " << arr[count] << endl;
arr[count]=0;
count--;
s[2]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[2]);
}
return true;
}
int main(){
setlocale(LC_ALL, "Russian");
const int n = 3, //число прогонов
Time = 1, //время работы каждого прогона
nTimerUnitsPerSecond = 10000000;
int i, y;
count=0;
InitializeCriticalSection(&cs);
hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
li = li-(Time * nTimerUnitsPerSecond);
hIEvent[0]=CreateEvent(NULL,TRUE,FALSE, NULL);
hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
hOEvent[0]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);
for(i=0; i<3; i++) s=0;
for(y=0; y<n; y++){
cout << "прогон №: " << y << endl;
ResetEvent(hIEvent[0]);
ResetEvent(hIEvent[1]);
SetEvent(hOEvent[0]);
SetEvent(hOEvent[1]);
SetEvent(hOEvent[2]);
SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);
hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
if (hThread[0] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
if (hThread[1] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);
ResumeThread(hThread[0]);
ResumeThread(hThread[1]);
hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
if (hThread[2] == 0) LastErrorMessage( GetLastError() );
hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
if (hThread[3] == 0) LastErrorMessage( GetLastError() );
hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
if (hThread[4] == 0) LastErrorMessage( GetLastError() );
WaitForMultipleObjects(5,hThread,TRUE,INFINITE);
for(i=0; i<5; i++) CloseHandle(hThread[i]);
}
CloseHandle(hTimer);
for (i=0 ; i<2; i++)CloseHandle(hIEvent[i]);
for (i=0 ; i<3 ;i++) CloseHandle(hOEvent[i]);
DeleteCriticalSection(&cs);
cout << "Число обработанных сообщений: " <<endl;
cout << "OutputThread first " << s[0] << endl;
cout << "OutputThread second " << s[1] << endl;
cout << "OutputThread third " << s[2] << endl;
cout << "Кол-во исследований: " << n << endl;
cout << "Время исследования примерно: " << Time << " сек" << endl;
cout << "Cреднее число обработанных сообщений:" << endl;
cout << "OutputThread 1 " << s[0]/n << endl;
cout << "OutputThread 2 " << s[1]/n << endl;
cout << "OutputThread 3 " << s[2]/n << endl;
cin.get();
return 0;
}
Задание: Реализовать схему "оповещения" трех ожидающих потоков о помещении в очередь (произвольного формата) некоторого сообщения на основе объекта синхронизации "событие". Генерируют события в очередь два потока, которые имеют приоритет на уровень ниже, чем ожидающие. Посчитать среднее число обработанных каждым потоком сообщений. Очередь должна быть защищена критической секцией.
[more=Код моей программы]
Код: #include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hTimer;
HANDLE hIEvent[2];
HANDLE hOEvent[3];
HANDLE hThread[5];
LPDWORD lpThreadId[5];
int count, s[3];
int arr[10];
RTL_CRITICAL_SECTION cs;
DWORD hTimerWait;
const LARGE_INTEGER *li;
void LastErrorMessage(int LastErrorCode){
cout << "Error Code: " << LastErrorCode << endl;
return;
}
DWORD InputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=1;
cout << "InputThread 1: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[0]);
}
return true;
}
DWORD InputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=2;
cout << "InputThread 2: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[1]);
}
return true;
}
DWORD OutputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 1: " << arr[count] << endl;
arr[count]=0;
count--;
s[0]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[0]);
}
return true;
}
DWORD OutputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 2: " << arr[count] << endl;
arr[count]=0;
count--;
s[1]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[1]);
}
return true;
}
DWORD OutputThread3(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 3: " << arr[count] << endl;
arr[count]=0;
count--;
s[2]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[2]);
}
return true;
}
int main(){
setlocale(LC_ALL, "Russian");
const int n = 3, //число прогонов
Time = 1, //время работы каждого прогона
nTimerUnitsPerSecond = 10000000;
int i, y;
count=0;
InitializeCriticalSection(&cs);
hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
li = li-(Time * nTimerUnitsPerSecond);
hIEvent[0]=CreateEvent(NULL,TRUE,FALSE, NULL);
hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
hOEvent[0]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);
for(i=0; i<3; i++) s=0;
for(y=0; y<n; y++){
cout << "прогон №: " << y << endl;
ResetEvent(hIEvent[0]);
ResetEvent(hIEvent[1]);
SetEvent(hOEvent[0]);
SetEvent(hOEvent[1]);
SetEvent(hOEvent[2]);
SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);
hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
if (hThread[0] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
if (hThread[1] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);
ResumeThread(hThread[0]);
ResumeThread(hThread[1]);
hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
if (hThread[2] == 0) LastErrorMessage( GetLastError() );
hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
if (hThread[3] == 0) LastErrorMessage( GetLastError() );
hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
if (hThread[4] == 0) LastErrorMessage( GetLastError() );
WaitForMultipleObjects(5,hThread,TRUE,INFINITE);
for(i=0; i<5; i++) CloseHandle(hThread[i]);
}
CloseHandle(hTimer);
for (i=0 ; i<2; i++)CloseHandle(hIEvent[i]);
for (i=0 ; i<3 ;i++) CloseHandle(hOEvent[i]);
DeleteCriticalSection(&cs);
cout << "Число обработанных сообщений: " <<endl;
cout << "OutputThread first " << s[0] << endl;
cout << "OutputThread second " << s[1] << endl;
cout << "OutputThread third " << s[2] << endl;
cout << "Кол-во исследований: " << n << endl;
cout << "Время исследования примерно: " << Time << " сек" << endl;
cout << "Cреднее число обработанных сообщений:" << endl;
cout << "OutputThread 1 " << s[0]/n << endl;
cout << "OutputThread 2 " << s[1]/n << endl;
cout << "OutputThread 3 " << s[2]/n << endl;
cin.get();
return 0;
}
netfil
Цитата:
И на что указывает этот указатель?
Цитата:
const LARGE_INTEGER *li;
И на что указывает этот указатель?
Abs62
Заменил эту строку на
Код: int li;
Заменил эту строку на
Код: int li;
...
LARGE_INTEGER li;
...
li.QuadPart = -Time * nTimerUnitsPerSecond;
...
SetWaitableTimer(hTimer, &li, 0, NULL, NULL, FALSE);
...
LARGE_INTEGER li;
...
li.QuadPart = -Time * nTimerUnitsPerSecond;
...
SetWaitableTimer(hTimer, &li, 0, NULL, NULL, FALSE);
...
ne_viens
спасибо, но зацикливание осталось, видимо, проблема в чем то еще...
спасибо, но зацикливание осталось, видимо, проблема в чем то еще...
...
while(hTimerWait==WAIT_TIMEOUT){
...
Таким образом ты контролируешь время работы потоков установленное с SetWaitableTimer() ?!
while(hTimerWait==WAIT_TIMEOUT){
...
Таким образом ты контролируешь время работы потоков установленное с SetWaitableTimer() ?!
ne_viens
да
да
Каким образом hTimerWait получит значение !WAIT_TIMEOUT, чтобы потоки вышли из while и завершили работу?
ne_viens
при достижении SetEvent(), по идее, hTimerWait должен становиться WAIT_OBJECT_0
при достижении SetEvent(), по идее, hTimerWait должен становиться WAIT_OBJECT_0
Не станет. Переменная получила своё значение от WaitForSingleObject()'ов и болше нет не одной строки кода, которая бы это изменила.
Чем не угодил:
while(flag)
{
doThreadStuff;
}
main()
flag = 1;
startThreads();
Sleep(1000);
flag = 0;
WaitForMultipleObjects();
?
Чем не угодил:
while(flag)
{
doThreadStuff;
}
main()
flag = 1;
startThreads();
Sleep(1000);
flag = 0;
WaitForMultipleObjects();
?
ne_viens
все оказалось проще, если во всех потоках
Код: hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
все оказалось проще, если во всех потоках
Код: hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
Полный справочник по C - ссылка на CHM версию. Сделал дерево (Содержание), Указатель, шрифт Verdana, с меньшим размером. Возможно чуть похже добавлю вкладку Поиск, используя компилятор от "HTML Help Workshop".
AZJIO
Спасибо, но ....
У меня оглавление кракозябрами. Локаль русская, Винда7 х64.
Оглавление слева кракозябрами, вообще вся панель с оглавлением, указателями и избранным.
В основном окне все нормально.
Спасибо, но ....
У меня оглавление кракозябрами. Локаль русская, Винда7 х64.
Оглавление слева кракозябрами, вообще вся панель с оглавлением, указателями и избранным.
В основном окне все нормально.
VitaliM
Я по началу сгенерировал TOC с помощью htm2chm, но там были тексты типа "& egrave ;", они имели регистр букв случайный, поэтому я переделал в обычный текст. Сейчас ещё попробую. Навсякий случай посмотри это, если дерево проблем с кодировкой не имеет, то подгоню всё к этому формату.
Странно ещё и ошибки в текстах имеются "Интерпритатор"
Я по началу сгенерировал TOC с помощью htm2chm, но там были тексты типа "& egrave ;", они имели регистр букв случайный, поэтому я переделал в обычный текст. Сейчас ещё попробую. Навсякий случай посмотри это, если дерево проблем с кодировкой не имеет, то подгоню всё к этому формату.
Странно ещё и ошибки в текстах имеются "Интерпритатор"
AZJIO
В файле CustomUDFs.chm в левой панели с русским языком все нормально - по русски.
В файле CustomUDFs.chm в левой панели с русским языком все нормально - по русски.
VitaliM
Ок, по той же ссылке перезалил, скомпилировав с помощью "HTML Help Workshop". Теперь вкладка "Поиск" есть.
Ок, по той же ссылке перезалил, скомпилировав с помощью "HTML Help Workshop". Теперь вкладка "Поиск" есть.
AZJIO
Теперь все отлично! Спасибо.
Теперь все отлично! Спасибо.
>netfil
Цитата:
то все работает
Цитата:
...
Код: while(WaitForSingleObject(hTimer, 100)==WAIT_TIMEOUT){
то все работает
Существует ли Tidy для Си,C++?
помогите пожалуйста на Си переделать, и напишите как скомпилировать правильно батником
ntdll.asm
Цитата:
ntdll.def
Цитата:
http://rghost.ru/43963366
пытаюсь сделать либу из инклуда для масма. а масм FASTCALL вызов не поддерживает, вот такая микрософта гадюка (в принципе мы не гордые, можем сами положить все куда надо и стек выровнять, но либу фиг сделаешь). делаю POASM-ом который FASTCALL понимает, но вот ни фига не получается. с родной библиотекой из DDK все работает, а с самодельными либами FASTCALL функции работать не хотят (decl stdcall работают). винда от дров сделанных с таким либами вообще валится, какая то ошибка ядра
ntdll.asm
Цитата:
.386
.model flat, stdcall
option casemap :none
.code
LibMain proc instance:DWORD, reason:DWORD, reserved:DWORD
mov eax, 1
ret
LibMain endp
RtlUshortByteSwap PROC FASTCALL PARAM1:DWORD
ret
RtlUshortByteSwap endp
end LibMain
ntdll.def
Цитата:
LIBRARY ntdll.dll
EXPORTS @RtlUshortByteSwap@4
http://rghost.ru/43963366
пытаюсь сделать либу из инклуда для масма. а масм FASTCALL вызов не поддерживает, вот такая микрософта гадюка (в принципе мы не гордые, можем сами положить все куда надо и стек выровнять, но либу фиг сделаешь). делаю POASM-ом который FASTCALL понимает, но вот ни фига не получается. с родной библиотекой из DDK все работает, а с самодельными либами FASTCALL функции работать не хотят (decl stdcall работают). винда от дров сделанных с таким либами вообще валится, какая то ошибка ядра
////////////////ntdll.c///////////////
//cl /Ox /LD ntdll.c ntdll.def
unsigned short __fastcall RtlUshortByteSwap(unsigned short x)
{
return _byteswap_ushort(x);
}
////////////////ntdll.def///////////////
LIBRARY ntdll
EXPORTS RtlUshortByteSwap
////////////////test.c///////////////
//cl /Ox test.c
#pragma comment(lib, "myntdll.lib")
unsigned short __fastcall RtlUshortByteSwap(unsigned short);
int main()
{
return RtlUshortByteSwap(0x2211);
}
Только нафик это надо, если можно просто inline написать: _byteswap_ushort(x);
Там 3 инструкции ассемблера.
//cl /Ox /LD ntdll.c ntdll.def
unsigned short __fastcall RtlUshortByteSwap(unsigned short x)
{
return _byteswap_ushort(x);
}
////////////////ntdll.def///////////////
LIBRARY ntdll
EXPORTS RtlUshortByteSwap
////////////////test.c///////////////
//cl /Ox test.c
#pragma comment(lib, "myntdll.lib")
unsigned short __fastcall RtlUshortByteSwap(unsigned short);
int main()
{
return RtlUshortByteSwap(0x2211);
}
Только нафик это надо, если можно просто inline написать: _byteswap_ushort(x);
Там 3 инструкции ассемблера.
Цитата:
Только нафик это надо, если можно просто inline написать: _byteswap_ushort(x);
Там 3 инструкции ассемблера.
не понял
Добавлено:
а где в коде вот эта часть? или она где то автоматом в инклудах? у меня то не студия а кусок от сутудии. сейчас попробую
Цитата:
LibMain proc instance:DWORD, reason:DWORD, reserved:DWORD
mov eax, 1
ret
Зачем вызывать RtlUshortByteSwap(), если полные ее аналоги на МАSMe:
mov al, ch
mov ah, cl
на C:
_byteswap_ushort(x);
При вызове из ntdll.dll добавляется
E8 04000000 CALL <JMP.&ntdll.RtlUshortByteSwap>
FF25 E8804000 JMP DWORD PTR DS:[<&ntdll.RtlUshortByteSwap>]
в начале и RET в конце.
Итого имеем кода на 300% больше.
LibMain() автоматом собирается из DEFAULTLIB.
mov al, ch
mov ah, cl
на C:
_byteswap_ushort(x);
При вызове из ntdll.dll добавляется
E8 04000000 CALL <JMP.&ntdll.RtlUshortByteSwap>
FF25 E8804000 JMP DWORD PTR DS:[<&ntdll.RtlUshortByteSwap>]
в начале и RET в конце.
Итого имеем кода на 300% больше.
LibMain() автоматом собирается из DEFAULTLIB.
затем что это практически единственная функция из ядра которую можно безопасно вызвать для проверки. а если на драйвере проверять от которого винда валится это бибилиотека обойтеся в винт, а может еще время на восстановление винды потребоваться
Проверки чего?
ne_viens
Цитата:
Добавлено:
ne_viens
_byteswap_ushort
я чета не понял, она что ли сама байты переворачивает, а не обращается к NTDLL.DLL ???
мне нужна динамическая библиотека которая только скелет дллки ntdll.dll повторяет, чтоб при компиляции она использовалась как таблица импорта(?). а байты можно и без подпрограммы перевернуть
http://rghost.ru/43966173 у меня есть инклуд сделанный из мсдновской библиотеки взятой из DDK. он будет лежать в инсталяторе масма. а когда масм будет инсталироваться то все либы сделаются из этих инклудов. тогда дистриутив будет весить всего ничего, в либах будет только все нужное, и некоторые исправления и исключения они учтут
Цитата:
судя по тому что и так переворачивает - вот так и есть то что надо
а как будет изменятьс код если параметров будет больше? код будет создаваться батником из инклудов
Цитата:
Добавлено:
вот так это выглядит. запусти батник makelibs. для 2000-ка они быстро делаются
http://rghost.ru/43967060
Добавлено:
Цитата:
Цитата:
а как stdcall и decl будут добавляться? а с возвращаемым числом я не намудрил?
Цитата:
.\bin\cl.exe /Ox /LD ntdll.c ntdll.def /link /libpath:.\lib /noentry
Добавлено:
ne_viens
_byteswap_ushort
я чета не понял, она что ли сама байты переворачивает, а не обращается к NTDLL.DLL ???
мне нужна динамическая библиотека которая только скелет дллки ntdll.dll повторяет, чтоб при компиляции она использовалась как таблица импорта(?). а байты можно и без подпрограммы перевернуть
http://rghost.ru/43966173 у меня есть инклуд сделанный из мсдновской библиотеки взятой из DDK. он будет лежать в инсталяторе масма. а когда масм будет инсталироваться то все либы сделаются из этих инклудов. тогда дистриутив будет весить всего ничего, в либах будет только все нужное, и некоторые исправления и исключения они учтут
Цитата:
unsigned long __fastcall RtlUshortByteSwap(unsigned long x)
{
return;
}
судя по тому что и так переворачивает - вот так и есть то что надо
а как будет изменятьс код если параметров будет больше? код будет создаваться батником из инклудов
Цитата:
EXTERNDEF SYSCALL @RtlUshortByteSwap@4:PROC
RtlUshortByteSwap textequ <@RtlUshortByteSwap@4>
EXTERNDEF SYSCALL @RtlUlonglongByteSwap@8:PROC
RtlUlonglongByteSwap textequ <@RtlUlonglongByteSwap@8>
EXTERNDEF SYSCALL @RtlUlongByteSwap@4:PROC
RtlUlongByteSwap textequ <@RtlUlongByteSwap@4>
EXTERNDEF SYSCALL @RtlInterlockedPushListSList@16:PROC
RtlInterlockedPushListSList textequ <@RtlInterlockedPushListSList@16>
Добавлено:
вот так это выглядит. запусти батник makelibs. для 2000-ка они быстро делаются
http://rghost.ru/43967060
Добавлено:
Цитата:
DbgPrintEx PROTO C :VARARG
DbgPrint PROTO C :VARARG
DbgBreakPoint PROTO STDCALL
CsrSetPriorityClass PROTO STDCALL :DWORD,:DWORD
CsrProbeForWrite PROTO STDCALL :DWORD,:DWORD,:DWORD
Цитата:
////////////////ntdll.c///////////////
//cl /Ox /LD ntdll.c ntdll.def
unsigned long __fastcall RtlUshortByteSwap(unsigned long x)
{
return 0;
}
unsigned long __fastcall RtlUlongByteSwap(unsigned long x)
{
return 0;
}
unsigned long __fastcall RtlUlonglongByteSwap(unsigned long x,unsigned long y)
{
return 0;
}
unsigned long __fastcall RtlInterlockedPushListSList(unsigned long w,unsigned long x,unsigned long y,unsigned long z)
{
return 0;
}
а как stdcall и decl будут добавляться? а с возвращаемым числом я не намудрил?
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.