Witam,
chcialbym wiedziec tylko bo ciezko cos jednoznacznego na ten temat <ort>znaleŹĆ</ort>.
Czy uzywajac
outb(0x378,dana_do_wysłania);
moge wysylas juz dane na lpt? Bez zadnych dodatkowych bibliotek?
pzdr

- Rejestracja:ponad 22 lata
- Ostatnio:około 7 godzin
0
a szukałeś na google? pierwszy wynik: http://www.abxzone.com/forums/f59/inb-outb-mmap-under-winxp-92365.html
z programu działającego w ring 3 (czyli w zasadzie każdy program użytkownika) nie masz bezpośredniego dostępu do portów (do sprzętu) w zasadzie pod żadnym systemem operacyjnym. poszukaj specjalnych bibliotek, które umożliwią takie operacje.
- Rejestracja:prawie 21 lat
- Ostatnio:ponad 9 lat
- Postów:513
0
Tak się składa że w ring3 można to zrobić bez dodatkowych sterowników. Wystarczy uruchomić program na odpowiednim koncie i poprosić system o dostęp:
#include "stdafx.h"
#include <windows.h>
#include <lmcons.h>
#include <mstask.h>
#include <lmat.h>
#include <wchar.h>
#include <conio.h> // kbhit
#pragma comment(lib, "netapi32.lib")
#pragma comment(lib, "mstask.lib")
#pragma comment(lib, "D:\\WINDDK\\3790.1830\\lib\\wxp\\i386\\ntdll.lib")
extern "C" int __declspec(dllimport) __stdcall ZwSetInformationProcess(int,int,void*,int);
#define ZwCurrentProcess() -1
#define ProcessUserModeIOPL 16
int SystemMain(int argc, _TCHAR* argv[])
{
int IOPL = 3;
int eflags;
ZwSetInformationProcess(ZwCurrentProcess(), ProcessUserModeIOPL, &IOPL, 4);
// sprawdenie czy mamy dostęp do portów
__asm
{
pushf
pop eflags
}
IOPL = (eflags >> 12) & 3;
if (IOPL != 3)
{
// w Virtual PC to się zdarzy
return MessageBox(0, TEXT("brak dostępu"), 0, 0);
}
// zabawa z portem LPT
puts("toggling LPT bits. Press any key to quit");
while (!_kbhit())
{
Beep(900,40);
_outp(888, 255);
Sleep(200);
Beep(900,40);
_outp(888, 0);
Sleep(200);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR text[32];
DWORD cch = 32;
GetUserName(text, &cch);
if (!_wcsicmp(text, L"SYSTEM"))
{
return SystemMain(argc, argv);
}
AT_INFO at = {0,0,0,0,GetCommandLine()};
DWORD dwJob;
CoInitialize(NULL);
NET_API_STATUS status = NetScheduleJobAdd(NULL, (byte*)&at, &dwJob);
if (status == 2184)
{
// to jest tymczasowe! powinieneś użyć StartService()
system("sc start schedule");
Sleep(1000);
status = NetScheduleJobAdd(NULL, (byte*)&at, &dwJob);
}
if (!status)
{
// job name
wsprintf(text, L"At%d", dwJob);
ITaskScheduler *scheduler;
if (!CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void**)&scheduler))
{
ITask *task;
if (!scheduler->Activate(text, IID_ITask, (IUnknown**)&task))
{
if (!task->Run())
{
// task is queued for run, wait a little
HRESULT hrStatus = SCHED_S_TASK_HAS_NOT_RUN;
BOOL fWait = TRUE;
while (fWait)
{
Sleep(200);
ITask *task2;
if (scheduler->Activate(text, IID_ITask, (IUnknown**)&task2))
break;
task2->GetStatus(&hrStatus);
if (hrStatus != SCHED_S_TASK_HAS_NOT_RUN)
fWait = FALSE;
task2->Release();
}
}
task->Release();
}
scheduler->Delete(text);
scheduler->Release();
}
}
CoUninitialize();
return 0;
}