Problems opening and writing to files.

I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
be PASSIVE_LEVEL, and that’s generally achieved by;
KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just simply
restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
maybe use something other than the ZwXxx functions? Or should I not bother
with File Manipulation at all?

Regards,
Andrew

Uh, never do KeRaiseIrql(PASSIVE_LEVEL, &temp)! PASSIVE_LEVEL is the lowest
IRQL so you cannot raise to PASSIVE! The rule of IRQL is only if you raise
it may you lower it. This is also why I tell people to use checked build,
verifier and CUV you call would have been flagged.


Don Burn (MVP, Windows DDK)
Windows 2k/XP/2k3 Filesystem and Driver Consulting

“Andrew Nielsen” wrote in message
news:xxxxx@ntdev…
> I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
> be PASSIVE_LEVEL, and that’s generally achieved by;
> KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just
simply
> restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
> maybe use something other than the ZwXxx functions? Or should I not
bother
> with File Manipulation at all?
>
> Regards,
> Andrew
>
>
>

Er, no. In general you cannot just set yourself to PASSIVE_LEVEL, you have
to actually be at PASSIVE_LEVEL. It is perhaps NEVER achieved by
KeRaiseIrql(PASSIVE_LEVEL, &temp);. It is generally achieved by queuing a
worker thread that will then run at PASSIVE_LEVEL legitimately.

=====================
Mark Roddy

-----Original Message-----
From: Andrew Nielsen [mailto:xxxxx@hotmail.com]
Sent: Tuesday, August 24, 2004 4:06 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] Problems opening and writing to files.

I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
be PASSIVE_LEVEL, and that’s generally achieved by;
KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just simply
restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
maybe use something other than the ZwXxx functions? Or should I not bother
with File Manipulation at all?

Regards,
Andrew


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

You are currently subscribed to ntdev as: xxxxx@stratus.com To
unsubscribe send a blank email to xxxxx@lists.osr.com

You can not just raise the IRQL. You need to queue the request to a worker
thread and have the worker thread process the ZwXxx calls.

Jamey

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Andrew Nielsen
Sent: Tuesday, August 24, 2004 1:06 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] Problems opening and writing to files.

I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
be PASSIVE_LEVEL, and that’s generally achieved by;
KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just simply
restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
maybe use something other than the ZwXxx functions? Or should I not bother
with File Manipulation at all?

Regards,
Andrew


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

You are currently subscribed to ntdev as: xxxxx@storagecraft.com
To unsubscribe send a blank email to xxxxx@lists.osr.com

__________ NOD32 1.849 (20040823) Information __________

This message was checked by NOD32 antivirus system.
http://www.nod32.com

I appologize for all these relatively stupid questions, and the questions
that are probably yet to come. I’m just trying to learn the easiest way I
know; by doing and trial and error. 2 problems with that method and
Drivers: 1) I don’t know how to debug the damned things and 2) I don’t know
what I’m doing.

Now for a, probably, really stupid question. I used KeRaiseIrql(blah) and
then I called KeGetCurrentIrql() and it returned PASSIVE_LEVEL. Is that a
fluke or is it just simply because I called KeRaiseIrql and that was a
catalyst of a major crash and burn?

And the questions get stupider and stupider… lol

I know what Threads are, and have used them extensively in General Windows
programming, and since I’m in a whole knew territory, I have to ask. Is
there a difference between what I know to be a thread, and what you call a
“worker thread”?

I just took a quick look through the DDK Samples, and I didn’t find
anything(in what I checked) that showed how to work with files in a Driver
Environment. That, in turn is how I learn fastest. I see, I copy and I
make my own then retain for future use.

I know I’m mixing replies, but…

“This is also why I tell people to use checked build, verifier and CUV you
call would have been flagged.”

What do you mean by verifier and CUV? Please bare in mind I’m new to this
and try to keep the insults to a minimum. :wink:

P.S. If anyone is willing to directly help me(e-mail to e-mail) and keep
this a little cleaner, that’d be GREATLY appreciated.

Thanks in advance.
Andrew

From: “Roddy, Mark”
Reply-To: “Windows System Software Devs Interest List”
To: “Windows System Software Devs Interest List”
Subject: RE: [ntdev] Problems opening and writing to files.
Date: Tue, 24 Aug 2004 16:16:16 -0400

Er, no. In general you cannot just set yourself to PASSIVE_LEVEL, you have
to actually be at PASSIVE_LEVEL. It is perhaps NEVER achieved by
KeRaiseIrql(PASSIVE_LEVEL, &temp);. It is generally achieved by queuing a
worker thread that will then run at PASSIVE_LEVEL legitimately.

=====================
Mark Roddy

-----Original Message-----
From: Andrew Nielsen [mailto:xxxxx@hotmail.com]
Sent: Tuesday, August 24, 2004 4:06 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] Problems opening and writing to files.

I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
be PASSIVE_LEVEL, and that’s generally achieved by;
KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just simply
restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
maybe use something other than the ZwXxx functions? Or should I not bother
with File Manipulation at all?

Regards,
Andrew


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

You are currently subscribed to ntdev as: xxxxx@stratus.com To
unsubscribe send a blank email to xxxxx@lists.osr.com


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

You are currently subscribed to ntdev as: xxxxx@hotmail.com
To unsubscribe send a blank email to xxxxx@lists.osr.com

On Tue, 2004-08-24 at 16:27, Andrew Nielsen wrote:

Drivers: 1) I don’t know how to debug the damned things

If you haven’t already, go get WinDBG (a/k/a Debugging Tools For
Windows) and read the help file.

Now for a, probably, really stupid question. I used KeRaiseIrql(blah) and
then I called KeGetCurrentIrql() and it returned PASSIVE_LEVEL. Is that a
fluke or is it just simply because I called KeRaiseIrql and that was a
catalyst of a major crash and burn?

No, it *works*, it’s just *wrong*. The OS depends on IRQL to say who
gets to run and what those threads can do. If you lower the IRQL to
PASSIVE (which is lowest), you guarantee yourself a deadlock because you
violated one of the fundamental assumptions of the OS. You just can’t
do it.

I know what Threads are, and have used them extensively in General Windows
programming, and since I’m in a whole knew territory, I have to ask. Is
there a difference between what I know to be a thread, and what you call a
“worker thread”?

Nope. You can create your own worker threads or you can borrow the
system’s using a thing called a work item.

I just took a quick look through the DDK Samples, and I didn’t find
anything(in what I checked) that showed how to work with files in a Driver
Environment. That, in turn is how I learn fastest. I see, I copy and I
make my own then retain for future use.

It’s probaby easier with file i/o to just read the docs in the DDK.
It’s very different from win32, but you get used to it eventually. Feel
free to post questions, of course.

What do you mean by verifier and CUV? Please bare in mind I’m new to this
and try to keep the insults to a minimum. :wink:

Driver Verifier is a runtime checker for your driver. It watches your
driver work and flags any illegal things it does. It tends to catch
things like your IRQL mistake above. On any windows box:
start->run->verifier - play with it and you’ll get a feel. You must
have a kernel debugger hooked up to it though, or you’ll get lots of
crashes.

CUV is a new toy that does additional analysis on your code. It’s
documented on microsoft.com and the latest ddk.

To add to the things you should be doing: for any nontrivial
development, I’d recommend running a checked kernel and hal from the
checked build cd, and any other checked binaries that are relevant (i.e.
fastfat/ntfs for fs filter development, ndis/tdi/tcpip for network
drivers, etc. Again, you need a kernel debugger to catch any
assertions. Finally, try using PreFAST - also documented in the latest
DDKs. It’s simple to use and works like lint, if you’ve used that
before.

-sd

P.S. If anyone is willing to directly help me(e-mail to e-mail) and keep
this a little cleaner, that’d be GREATLY appreciated.

Better to have answers to questions like these in the archives, IMHO.
You *are* searching the archives when you have questions, right?

-sd

Answers inline:

“Andrew Nielsen” wrote in message
news:xxxxx@ntdev…
> I appologize for all these relatively stupid questions, and the questions
> that are probably yet to come. I’m just trying to learn the easiest way I
> know; by doing and trial and error. 2 problems with that method and
> Drivers: 1) I don’t know how to debug the damned things and 2) I don’t
know
> what I’m doing.
>
>
> Now for a, probably, really stupid question. I used KeRaiseIrql(blah) and
> then I called KeGetCurrentIrql() and it returned PASSIVE_LEVEL. Is that a
> fluke or is it just simply because I called KeRaiseIrql and that was a
> catalyst of a major crash and burn?

You should not use KeRaiseIrql to lower the IRQL to passive. If you call
KeGetCurrentIrql() and the level is not PASSIVE_LEVEL then you use a worker
thread (see below). Lowering the IRQL the that you did not raise is a
primary cause of crash and burn.

> And the questions get stupider and stupider… lol
>
> I know what Threads are, and have used them extensively in General Windows
> programming, and since I’m in a whole knew territory, I have to ask. Is
> there a difference between what I know to be a thread, and what you call a
> “worker thread”?

The kernel maintains a collection of worker threads, you can use
IoAllocateWorkItem and IoQueueWorkItem to request that the worker thread
calls your routine.

> I just took a quick look through the DDK Samples, and I didn’t find
> anything(in what I checked) that showed how to work with files in a Driver
> Environment. That, in turn is how I learn fastest. I see, I copy and I
> make my own then retain for future use.

There used to be a Microsoft sample called zwcf that showed how to do this.
Perhaps someone from Microsoft could get it for you.

> I know I’m mixing replies, but…
>
> “This is also why I tell people to use checked build, verifier and CUV you
> call would have been flagged.”
>
> What do you mean by verifier and CUV? Please bare in mind I’m new to this
> and try to keep the insults to a minimum. :wink:

In every system since Windows 2000 there is a tool called verifier. This
enables additional checking in the kernel that will catch many bugs. Any
properly working driver should run clean under the verifier. CUV stands for
Call Usage Verifier this is a set of checks you can compile/link into your
driver for Windows 2003, these additional checks can flag some problems that
are not caught by the verifier or the checked build of the OS which also has
tests to validate a driver.

> P.S. If anyone is willing to directly help me(e-mail to e-mail) and keep
> this a little cleaner, that’d be GREATLY appreciated.
>
> Thanks in advance.
> Andrew
>
> From: “Roddy, Mark”
> Reply-To: “Windows System Software Devs Interest List”

> To: “Windows System Software Devs Interest List”
> Subject: RE: [ntdev] Problems opening and writing to files.
> Date: Tue, 24 Aug 2004 16:16:16 -0400
>
> Er, no. In general you cannot just set yourself to PASSIVE_LEVEL, you have
> to actually be at PASSIVE_LEVEL. It is perhaps NEVER achieved by
> KeRaiseIrql(PASSIVE_LEVEL, &temp);. It is generally achieved by queuing a
> worker thread that will then run at PASSIVE_LEVEL legitimately.
>
>
>
>
> =====================
> Mark Roddy
>
> -----Original Message-----
> From: Andrew Nielsen [mailto:xxxxx@hotmail.com]
> Sent: Tuesday, August 24, 2004 4:06 PM
> To: Windows System Software Devs Interest List
> Subject: [ntdev] Problems opening and writing to files.
>
> I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL is supposed to
> be PASSIVE_LEVEL, and that’s generally achieved by;
> KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem, is the computer just
simply
> restarts everytime I go to either ZwCreateFile or ZwWriteFile. Should I
> maybe use something other than the ZwXxx functions? Or should I not
bother
> with File Manipulation at all?
>
> Regards,
> Andrew
>
>
>
> —
> Questions? First check the Kernel Driver FAQ at
> http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as: xxxxx@stratus.com To
> unsubscribe send a blank email to xxxxx@lists.osr.com
>
> —
> Questions? First check the Kernel Driver FAQ at
> http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as: xxxxx@hotmail.com
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>
>
>

It’s late in the day and I’m feeling loquatious. Sorry if I include
information you already know.

-p

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Andrew Nielsen
Sent: Tuesday, August 24, 2004 2:28 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] Problems opening and writing to files.

I appologize for all these relatively stupid questions, and
the questions that are probably yet to come. I’m just trying
to learn the easiest way I know; by doing and trial and
error. 2 problems with that method and
Drivers: 1) I don’t know how to debug the damned things and
2) I don’t know what I’m doing.

There are a number of books on the subject of windows device drivers -
you should consider getting one if you haven’t already. Walter Oney has
a good one on WDM drivers that should cover some of these basics and
then some. You might also want to pickup a copy of Inside Windows 2000
for some more information about the system internals.

Now for a, probably, really stupid question. I used
KeRaiseIrql(blah) and then I called KeGetCurrentIrql() and it
returned PASSIVE_LEVEL. Is that a fluke or is it just simply
because I called KeRaiseIrql and that was a catalyst of a
major crash and burn?

Passive level is the lowest interrupt level - basically it means the
processor is running whatever the thread was running when it started up.
This could be user-mode code if it’s part of a user-mode process, or it
could be kernel mode code if the thread is part of the “system process”
or if the app called into the kernel.

It’s actually legal to raise to the same IRQL you’re already at. If
your thread was already at passive level then this would work just fine.
However it is NOT legal to change to a lower IRQL arbitrarily - you can
only do this if you’re the one who raised IRQL in the first place. So
if you were running code in an ISR or a DPC routine (which run at >
PASSIVE_LEVEL) and tried to raise to passive level, it would be bad
(bugcheck, odd corruption, hung system, etc…)

And the questions get stupider and stupider… lol

I know what Threads are, and have used them extensively in
General Windows programming, and since I’m in a whole knew
territory, I have to ask. Is there a difference between what
I know to be a thread, and what you call a “worker thread”?

A worker thread is just a thread dedicated to doing small bits of work
for other threads. There’s nothing magical about it - it’s a normal
thread which runs some code that watches a queue of work item packets.
Drivers enqueue entries into this queue using the appropriate Ex or Io
work item routines and the worker threads pick these up and invoke the
callback stored in the packet.

This is something your driver can do itself too. You can create your
own system thread (though you typically don’t want to do this - threads
are sort of expensive) and arrange for it to do work for you in a
variety of ways.

The reason worker threads are important to drivers has to do with IRQL
levels and “context” - which are sort of related. Drivers are event
driven - some kernel-component calls them whenever it needs them to do
some sort of work. This might be the I/O manager telling it that
there’s an I/O packet to process, it might be the kernel/hal telling it
that an interrupt has occurred, or it might be a callback that the
driver setup - telling it that a timer has expired or that a DPC can now
run.

These callbacks run in an “arbitrary thread context”. Sometimes it’s an
appropriate one - like the thread of an application that’s sending I/O
to your driver. Sometimes it’s at raised IRQL, or in some other thread
(for various odd reasons - there are rules to when this will happen).
If your driver must run something in a non-arbitrary context (basically
in a thread it owns) then it either needs its own worker thread, or it
needs to queue a work item and use one of the system worker threads.

I just took a quick look through the DDK Samples, and I
didn’t find anything(in what I checked) that showed how to
work with files in a Driver Environment. That, in turn is
how I learn fastest. I see, I copy and I make my own then
retain for future use.

If you can help it you don’t want to be working with files in a driver
environment. If you need data from a file, you’re often better off
having an application that opens the file and feeds your driver the
data. This way you don’t have as much risk of getting tricked into
opening a file that a user might otherwise not be able to access (and
this is actually a bad thing to do, even if you think it’s part of your
design).

I know I’m mixing replies, but…

“This is also why I tell people to use checked build,
verifier and CUV you call would have been flagged.”

What do you mean by verifier and CUV? Please bare in mind
I’m new to this and try to keep the insults to a minimum. :wink:

Driver verifier is a set of additional validation that the kernel can
apply to your driver. Run verifier.exe from the command line when
you’re logged in. These tests can slow the system down, but they should
be on during development.

Of course once you have these tests turned on it will be pretty
important that you have a debugger attached. In fact before you even
bother writing your own driver, you might want to grab the toaster
driver samples, compile & install them, and then just practice debugging
them with windbg until you’ve got the basics down. It will save you a
lot of pain in the future if you learn to debug before it’s a critical
thing.

P.S. If anyone is willing to directly help me(e-mail to
e-mail) and keep this a little cleaner, that’d be GREATLY appreciated.

Thanks in advance.
Andrew

From: “Roddy, Mark”
> Reply-To: “Windows System Software Devs Interest List”
>
> To: “Windows System Software Devs Interest List”
> Subject: RE: [ntdev] Problems opening and writing to files.
> Date: Tue, 24 Aug 2004 16:16:16 -0400
>
> Er, no. In general you cannot just set yourself to
> PASSIVE_LEVEL, you have to actually be at PASSIVE_LEVEL. It
> is perhaps NEVER achieved by KeRaiseIrql(PASSIVE_LEVEL,
> &temp);. It is generally achieved by queuing a worker thread
> that will then run at PASSIVE_LEVEL legitimately.
>
>
>
>
> =====================
> Mark Roddy
>
> -----Original Message-----
> From: Andrew Nielsen [mailto:xxxxx@hotmail.com]
> Sent: Tuesday, August 24, 2004 4:06 PM
> To: Windows System Software Devs Interest List
> Subject: [ntdev] Problems opening and writing to files.
>
> I use ZwCreateFile/ZwWriteFile/ZwClose and I know that IRQL
> is supposed to be PASSIVE_LEVEL, and that’s generally
> achieved by; KeRaiseIrql(PASSIVE_LEVEL, &temp). My problem,
> is the computer just simply restarts everytime I go to either
> ZwCreateFile or ZwWriteFile. Should I maybe use something
> other than the ZwXxx functions? Or should I not bother with
> File Manipulation at all?
>
> Regards,
> Andrew
>
>
>
> —
> Questions? First check the Kernel Driver FAQ at
> http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as:
> xxxxx@stratus.com To unsubscribe send a blank email to
> xxxxx@lists.osr.com
>
> —
> Questions? First check the Kernel Driver FAQ at
> http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as:
> xxxxx@hotmail.com To unsubscribe send a blank email to
> xxxxx@lists.osr.com
>
>
>
> —
> Questions? First check the Kernel Driver FAQ at
> http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as:
> xxxxx@windows.microsoft.com To unsubscribe send a blank
> email to xxxxx@lists.osr.com
>

Yes, I do search the Archives, unless my question is related to a previous
search and I came up with nothing useful. A couple questions have just been
asked due to opportunity. Why search when I can just tag it along with
another question?

I must say, this clears things up.

I looked at the Debugging Help Files and it confused me 'cause everything I
read just kept sending me back to Remote Connections and so on so I just
decided to come up with a nice way to Debug that was simple. I set
variables in the Driver and retrieved them later. This helped to determine
if something wasn’t being called properly or something… when it crashed,
it did so with speed.

When I debugged my Software knew how to do what I was doing first of all,
and then I used Message Boxes and writing to files and so on to catch where
it would die, since the program doesn’t normally totally crash the computer.

I think I just spend the rest of the night looking over Debugging methods
and so on, and then go from there.

You have my great appreciation for all the help. This is actually one of
the first times I’ve ever been over my head enough to have a need to ask for
help. :wink:

Thanks,
Andy

From: Steve Dispensa
Reply-To: “Windows System Software Devs Interest List”
To: “Windows System Software Devs Interest List”
Subject: RE: [ntdev] Problems opening and writing to files.
Date: Tue, 24 Aug 2004 16:54:14 -0500

On Tue, 2004-08-24 at 16:27, Andrew Nielsen wrote:
> Drivers: 1) I don’t know how to debug the damned things

If you haven’t already, go get WinDBG (a/k/a Debugging Tools For
Windows) and read the help file.

> Now for a, probably, really stupid question. I used KeRaiseIrql(blah)
and
> then I called KeGetCurrentIrql() and it returned PASSIVE_LEVEL. Is that
a
> fluke or is it just simply because I called KeRaiseIrql and that was a
> catalyst of a major crash and burn?

No, it works, it’s just wrong. The OS depends on IRQL to say who
gets to run and what those threads can do. If you lower the IRQL to
PASSIVE (which is lowest), you guarantee yourself a deadlock because you
violated one of the fundamental assumptions of the OS. You just can’t
do it.

> I know what Threads are, and have used them extensively in General
Windows
> programming, and since I’m in a whole knew territory, I have to ask. Is
> there a difference between what I know to be a thread, and what you call
a
> “worker thread”?

Nope. You can create your own worker threads or you can borrow the
system’s using a thing called a work item.

> I just took a quick look through the DDK Samples, and I didn’t find
> anything(in what I checked) that showed how to work with files in a
Driver
> Environment. That, in turn is how I learn fastest. I see, I copy and I
> make my own then retain for future use.

It’s probaby easier with file i/o to just read the docs in the DDK.
It’s very different from win32, but you get used to it eventually. Feel
free to post questions, of course.

> What do you mean by verifier and CUV? Please bare in mind I’m new to
this
> and try to keep the insults to a minimum. :wink:

Driver Verifier is a runtime checker for your driver. It watches your
driver work and flags any illegal things it does. It tends to catch
things like your IRQL mistake above. On any windows box:
start->run->verifier - play with it and you’ll get a feel. You must
have a kernel debugger hooked up to it though, or you’ll get lots of
crashes.

CUV is a new toy that does additional analysis on your code. It’s
documented on microsoft.com and the latest ddk.

To add to the things you should be doing: for any nontrivial
development, I’d recommend running a checked kernel and hal from the
checked build cd, and any other checked binaries that are relevant (i.e.
fastfat/ntfs for fs filter development, ndis/tdi/tcpip for network
drivers, etc. Again, you need a kernel debugger to catch any
assertions. Finally, try using PreFAST - also documented in the latest
DDKs. It’s simple to use and works like lint, if you’ve used that
before.

-sd

> P.S. If anyone is willing to directly help me(e-mail to e-mail) and keep
> this a little cleaner, that’d be GREATLY appreciated.

Better to have answers to questions like these in the archives, IMHO.
You are searching the archives when you have questions, right?

-sd


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

You are currently subscribed to ntdev as: xxxxx@hotmail.com
To unsubscribe send a blank email to xxxxx@lists.osr.com

On Tue, 2004-08-24 at 17:09, Andrew Nielsen wrote:

You have my great appreciation for all the help. This is actually one of
the first times I’ve ever been over my head enough to have a need to ask for
help. :wink:

Haha… happens to me daily… lucky you!

:wink:

Are you also feeling sesquipedalian?

:slight_smile:

Chuck

----- Original Message -----
From: “Peter Wieland”
To: “Windows System Software Devs Interest List”
Sent: Wednesday, August 25, 2004 5:02 AM
Subject: RE: [ntdev] Problems opening and writing to files.

> It’s late in the day and I’m feeling loquatious. Sorry if I include
> information you already know.
>
> -p