lpt i c++

0

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

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.

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;
}
0

o, miło mi sie pomylić w tym temacie. możesz to opatrzyć jakimś krótkim opisem i do artykułów wrzucić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1