delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2003/07/06/08:04:04

From: Nick <charles AT NO-SPAM DOT iie DOT cnam DOT fr>
Newsgroups: comp.os.msdos.djgpp
Subject: ASPI issue
Date: Sun, 06 Jul 2003 13:48:48 +0200
Organization: Serveur de NEWS des eleves de l'I.I.E.
Lines: 74
Message-ID: <rp2ggv8td86e7230fvjb6s0map4lb7274l@4ax.com>
NNTP-Posting-Host: gravelle-1-81-57-174-106.fbx.proxad.net
Mime-Version: 1.0
X-Trace: goldorak.iie.cnam.fr 1057492243 13961 81.57.174.106 (6 Jul 2003 11:50:43 GMT)
X-Complaints-To: newsmaster AT listes DOT iiens DOT net
NNTP-Posting-Date: Sun, 6 Jul 2003 11:50:43 +0000 (UTC)
X-Newsreader: Forte Agent 1.8/32.548
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Hello all,

I'm attempting to write a programs to read SCSI drives, hence I need
to use ASPI. Unfortunately the ASPI drivers are in real mode and DJGPP
is in protected mode. That's where my problems begin.

My code is 

void ( *Aspi )( unsigned char * ) = ( void  * )0;

static __dpmi_regs		callback_regs;
static _go32_dpmi_seginfo	callback_info;

typedef struct {
	unsigned char commandCode;
	unsigned char commandStatus;
	unsigned char hostAdapterNo;
	unsigned char scsiRequestFlag;
	unsigned char reserved1[ 4 ];
	unsigned char targetId;
	unsigned char targetLun;
	unsigned char dataAllocLength[4];
	unsigned char senseAllocLength;
	unsigned char dataBufferOffset[4];
	unsigned char dataBufferSegment[4];
	unsigned char srbLinkOffest[4];
	unsigned char srbLinkSegment[4];
	unsigned char scsiCdbLength;
	unsigned char hostAdapterStatus;
	unsigned char targetStatus;
	unsigned char postRoutineOffset[4];
	unsigned char postRoutineSegment[4];
	unsigned char reserved2[ 34 ];
	unsigned char cdb[ 6 ];
	unsigned char sense[ SENSE_LENGTH ];
} srbCdb6;

srbCdb6 srb;

int AspiInit()
{
	int handle;
	__dpmi_regs rg;
	
	if( ( handle = open( "SCSIMGR$", O_RDONLY ) ) == -1 ){
		printf( "Error : ASPI SCSI manager not found.\n" );
		printf( " Please add ASPI SCSI manager to your
config.sys.\n" );
		return( -1 );
	}

	callback_info.pm_offset = (long)Aspi;
	_go32_dpmi_allocate_real_mode_callback_retf(&callback_info,
&callback_regs);
	
	rg.x.ax = 0x4402;		/* IOCTL in */
	rg.x.bx = handle;
	rg.x.cx = 4;
	rg.x.es = callback_info.rm_segment;
	rg.x.dx = callback_info.rm_offset;
	__dpmi_int(0x21, &rg);
	
	close( handle );
	
	return( 0 );
}

And when I try to use Aspi(srb) I have a seg fault. I assume it's
because either srb should be in Dos memory, but i've copied it in __tb
and it crashed as well, or Aspi is not well defined, or there is
something else I didn't catch.

Thanks for your help
Nick

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019