Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 296
  • Last Modified:

Equivalence !

What's the equivalent of the function 'outportb' (Borland C++ 3.1 [DOS]) in Microsoft Visual C++ 5.0 [WINDOWS] ?
0
mike_marquet
Asked:
mike_marquet
  • 4
  • 3
  • 2
  • +2
1 Solution
 
jkrCommented:
You cannot access the hardware directly on 32bit Windows platforms, so there simply is _no_ equivalent for this function - sorry that the answer is so negative, but i all i can do is to point you to the Win9x/NT DDKs (Device Driver Kits)...
Why do you need to use 'outportb()'? Maybe we can find a way to get around this...
0
 
viktornetCommented:
you could use assembler to send stuff to the ports....

asm {
  mov al, 5
  mov dl, 2h
  out dl, al
}

which would write the value 5 to port 2...

-Viktor
--Ivanov
0
 
mike_marquetAuthor Commented:
I want to access an I/O card with 8255 chips.
Can I use assembler in a window program ?
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
koskiaCommented:
ofcourse you can use assembler,
but you must take in consideration that window handles the ports. and some other applications may also try to do the same,
in a multithreaded environment you're taking a big risk
0
 
mike_marquetAuthor Commented:
Thanks. I will try it.

0
 
jkrCommented:
You may of course reject the answer, but this does _NOT_ affect the fact that it is true...
asm {
  mov al, 5
  mov dl, 2h
  out dl, al
}
-> EXCEPTION_PRIV_INSTRUCTION ;-)
0
 
jrmcgCommented:
To read and write to a port say COM 1 use this --
#include <conio.h>

UINT Port = 1016 // 3F8
int    Data = 2;
int    ReturnData;
// Write
_outp(Port, Data);

// Read
ReturnData = _inp(Port);

This is what I use.  Again you need to keep in mind that windows can still use those ports,  if you are writing to your own card just use the address of that port.  As long as you haven't installed other software that is accessing that card for one reason or another you shouldn't have any problems.

Let me know if you need further help with it..

J.R.
0
 
viktornetCommented:
jkr, I just tried to give something like a pseudo code and say that the individual could use Assembler.. that's all.. I've never said that the code I wrote will work just the way it is... :))

-Viktor
--Ivanov
0
 
jkrCommented:
Viktor, i agree - you can always use assembler, but certain instructions are restricted to ring 0 (i.e. kernel mode)...
0
 
mike_marquetAuthor Commented:
To JKR,

How can I set the privilege on NT to use inp(...) ?

I have try this but it doesn't work !

  BOOL             rcCode;
  HANDLE           hToken;
  TOKEN_PRIVILEGES tkp;

  rcCode = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
  if (rcCode == FALSE) return FALSE;

  LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &tkp.Privileges[0].Luid);

  tkp.PrivilegeCount = 1; // One privileges to set
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

  if (GetLastError() != ERROR_SUCCESS) return FALSE;

0
 
jkrCommented:
You cannot - privileged instructions only work in ring0 (i.e. kernel mode), as i stated in my answer which you have chosen to reject ;-)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

  • 4
  • 3
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now