mguyott@mirror.TMC.COM (Marc Guyott) (09/28/88)
Questions, Questions, Questions, but first some background!
I am going to be doing some development work where I will be writing
the low level support for a network data server that will be running under
MS Windows 2.1 and will interface with a Novell Advanced Netware network.
I know of at least one piece of software that has been written to run under
Windows and that uses a Novell network (Automated Design Systems Inc.
is selling "Windows Intercom", a chat utility that allows Windows users to
exchange instantaneous messages with other LAN users while running
applications).
In order for a network application to wait for a message it calls LISTEN FOR
SEQUENCED PACKET (SPX protocol) and passes Netware the appropriate buffers
as well as a pointer to an Event Service Routine (ESR). An ESR is a from of
interrupt service routine and it is called with INTERRUPTS DISABLED.
I currently have several questions that I have not been able to get
satisfactory answers to (I have looked in Petzold's book and in the Windows
documentation). Does anyone know the answers to any of these questions?
1. Can an ESR post a message to the applications window queue while INTERRUPTS
ARE DISABLED? Since the ESR is part of the application, it will have access
to the handle for the window.
2. Is there a way to look for a particular type of message in an applications
window queue from within the application itself (not from within an ESR)?
Specifically, what are the wMsgFilterMin and wMsgFilterMax parameters for
in the PeekMessage call? Do they specify an ordinal range, i.e. only give
me messages starting with the 10th message and up to the 20th message, or
do they specify the message type, i.e. give me the first messages of type
WM_KEYDOWN (if wMsgFilterMin = wMsgFilterMax = WM_KEYDOWN)?
3. The DS register must be initialized by an ESR before any references are
made to application variables. Novell recommends setting DS in the
following manner:
public MyESR
MyESR proc far
mov ax, DGroup
mov ds, ax
call CFunction
ret
MyESR endp
My question is will this work under Windows? If the data segment is
movable then I do not believe that this will work and I have serious
doubts that this will work even if the data segment is fixed. When is
the symbol DGroup assigned a value? At link time? At load time? Does
Windows update the value of this symbol if the data segment is moved?
4. I thought of an alternative to the above which may work but I see one
weak spot in it. If I take a pointer to the 'C' portion of the ESR (which
has been exported in the .def file) and create a code thunk for this
routine (via MakeProcInstance) and then invoke the assembly code shown
below which calls the code thunk, I should get the results that I desire
(that is the DS register will be set to the appropriate value).
public MyESR
MyESR proc far
push ss
push sp
call CCodeForESR
pop sp
pop ss
ret
MyESR endp
The only problem is how do I get the appropriate value to call
(CCodeForESR) - if this is a code thunk then the address is in a variable
but I can not get to variables until I set the DS register and the DS
register will not be set until I call the code thunk...
Comments, questions, etc., are all welcome.
Marc
----
... I never saw the morning until I stayed up all night ...
Tom Waits
Marc Guyott mguyott@mirror.TMC.COM
{mit-eddie, pyramid, harvard!wjh12, xait, datacube}!mirror!mguyott
Mirror Systems Cambridge, MA 02140 617/661-0777