Newsgroup: it.comp.programmare
Titolo: Lettura indirizzo

Salve ragazzi, ho un problema con _inp(). Non sto riuscendo a capire perché
quando vado a leggere con _inp(0xCF8) (infirizzo bus pci) mi genera un
errore del tipo "privileged instruction". Come posso fare a risolvere il
problema?
Grazie

LordSimp wrote:

Il problema deriva dal fatto che probabilmente stai eseguendo il tuo 
programma su un sistema operativo che lavora in modalità protetta e 
protegge l'accesso diretto alle porte hardware. Per poter accedere a tali 
indirizzi, è necessario lavorare allo stesso livello del sistema operativo.
Ci sono varie soluzioni al problema:
1) cambiare sistema operativo (es: passare al vetusto MS-DOS che non 
lavorava in questa modalità);
2) accedere a file che rappresentano le periferiche (solo sotto Linux/Unix);
3) scrivere un device driver (sotto Windows e Linux) che lavorano allo 
stesso livelolo del sistema operativo.
Ciao.
-- 
---
*************** | Have you ever retired a human by mystake?
*** Azathot *** |
*************** | To contact me, ask me gently. Thanks.

 Linux/Unix);
'staddě?
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.2. C, C++ and ASM developers
                               and beta testers are welcome!

 'staddì?
        FILE * io_ports = fopen( "/dev/port", "rb" );
"man port" per maggiori info.


 ha scritto nel messaggio
news:eFIZa.41682$sj6.9...@tornado.fastwebnet.it...


 driver? Grazie
il DDK. Per darti un aiuto il driver te lo scrivo io. La periferica che 
gestisce si chiama \\.\ioport e si usa come la \dev\port di Linux:
VOID IoportUnload(IN PDRIVER_OBJECT DriverObject)
{ UNREFERENCED_PARAMETER(DriverObject); }
NTSTATUS IoportDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 NTSTATUS nStatus = STATUS_SUCCESS;
 PIO_STACK_LOCATION pislIrpStack = IoGetCurrentIrpStackLocation(Irp);
 UNREFERENCED_PARAMETER(DeviceObject);
 switch(pislIrpStack->MajorFunction)
 {
  case IRP_MJ_READ:
  {
   if(pislIrpStack->Parameters.Read.ByteOffset.HighPart != 0)
   {
    nStatus = STATUS_INVALID_PARAMETER;
    break;
   }
   READ_PORT_BUFFER_UCHAR
   (
    (PUCHAR)pislIrpStack->Parameters.Read.ByteOffset.LowPart,
    Irp->AssociatedIrp.SystemBuffer,
    pislIrpStack->Parameters.Read.Length
   );
   break;
  }
  case IRP_MJ_WRITE:
  {
   if(pislIrpStack->Parameters.Write.ByteOffset.HighPart != 0)
   {
    nStatus = STATUS_INVALID_PARAMETER;
    break;
   }
   WRITE_PORT_BUFFER_UCHAR
   (
    (PUCHAR)pislIrpStack->Parameters.Write.ByteOffset.LowPart,
    Irp->AssociatedIrp.SystemBuffer,
    pislIrpStack->Parameters.Write.Length
   );
   break;
  }
  case IRP_MJ_CREATE:
  case IRP_MJ_CLOSE:
   break;
  default:
   nStatus = STATUS_INVALID_DEVICE_REQUEST;
 }
 Irp->IoStatus.Status = nStatus;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return nStatus;
}
NTSTATUS DriverEntry
(
 IN PDRIVER_OBJECT DriverObject, 
 IN PUNICODE_STRING RegistryPath
)
{
 NTSTATUS nStatus;
 UNICODE_STRING wstrDeviceName;
 PDEVICE_OBJECT pdoDevice;
 RtlInitUnicodeString(&wstrDeviceName, L"\\Device\\ioport");
 nStatus = IoCreateDevice
 (
  DriverObject,
  0,
  &wstrDeviceName,
  FILE_DEVICE_UNKNOWN,
  FALSE,
  &pdoDevice
 );
 if(!NT_SUCCESS(nStatus)) return nStatus;
 RtlInitUnicodeString(&wstrDosDeviceName, L"\\??\\ioport");
 nStatus = IoCreateSymbolicLink(&wstrDosDeviceName, &wstrDeviceName);
 if(!NT_SUCCESS(nStatus))
 {
  IoDeleteDevice(nStatus);
  return nErrCode;
 }
 DriverObject->DriverUnload = &IoportUnload;
 DriverObject->MajorFunction[IRP_MJ_CLOSE] = &IoportDispatch;
 DriverObject->MajorFunction[IRP_MJ_CREATE] = &IoportDispatch;
 DriverObject->MajorFunction[IRP_MJ_READ] = &IoportDispatch;
 DriverObject->MajorFunction[IRP_MJ_WRITE] = &IoportDispatch;
 pdoDevice->Flags |= DO_BUFFERED_IO;
 MmPageEntireDriver(&DriverEntry);
 return STATUS_SUCCESS;


 ha scritto nel messaggio
news:Xns93D71FA4...@127.0.0.1...


 ha scritto nel messaggio
news:Xns93D71FA4...@127.0.0.1...


 ha scritto nel messaggio
news:Xns93D71FA4...@127.0.0.1...


 il driver che mi hai mandato? Win32Application? Dll?
non puoi con Visual C++. I driver vanno compilati con il comando build, 
incluso nel DDK. Se ciň č un problema, dovrebbero esistere aggiunte per 
scrivere driver con Visual C++


 ordinare il cd. (mi vanno bene anche per nt 4 o 2000)
vero, non si puň piů scaricare dal loro sito. Prenditi eMule, cerca con 
Google "server.met" per trovare siti che pubblicano le liste di server, 
cerca il DDK con eMule e scaricalo da lě
