Global variables

Is it potentionally dangerous to use global variables in a driver?

Slava


Do You Yahoo!?
Buy the perfect holiday gifts at Yahoo! Shopping.
http://shopping.yahoo.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

It is potentially dangerous to do *anything* in a driver :slight_smile: However global
data is not more or less dangerous than other data. (Actually as it is not
the drivers responsibility to allocate/deallocate global data an argument
could be made that it is less dangerous.)

-----Original Message-----
From: Slava Abramov [mailto:xxxxx@yahoo.com]
Sent: Tuesday, December 04, 2001 2:03 PM
To: NT Developers Interest List
Subject: [ntdev] Global variables

Is it potentionally dangerous to use global variables in a driver?

Slava


Do You Yahoo!?
Buy the perfect holiday gifts at Yahoo! Shopping. http://shopping.yahoo.com


You are currently subscribed to ntdev as: xxxxx@stratus.com To
unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

It is always dangerous to abuse global variables, but sometimes globals are
unavoidable and provide durable solutions to otherwise tricky coding.

Gary G. Little
Broadband Storage, Inc.
xxxxx@broadstor.com
xxxxx@inland.net
(949) 7372731

-----Original Message-----
From: Roddy, Mark [mailto:xxxxx@stratus.com]
Sent: Tuesday, December 04, 2001 11:07 AM
To: NT Developers Interest List
Subject: [ntdev] RE: Global variables

It is potentially dangerous to do *anything* in a driver :slight_smile: However global
data is not more or less dangerous than other data. (Actually as it is not
the drivers responsibility to allocate/deallocate global data an argument
could be made that it is less dangerous.)

-----Original Message-----
From: Slava Abramov [mailto:xxxxx@yahoo.com]
Sent: Tuesday, December 04, 2001 2:03 PM
To: NT Developers Interest List
Subject: [ntdev] Global variables

Is it potentionally dangerous to use global variables in a driver?

Slava


Do You Yahoo!?
Buy the perfect holiday gifts at Yahoo! Shopping. http://shopping.yahoo.com


You are currently subscribed to ntdev as: xxxxx@stratus.com To
unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: xxxxx@broadstor.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> -----Original Message-----

From: Slava Abramov [mailto:xxxxx@yahoo.com]
Sent: Tuesday, December 04, 2001 11:03 AM

Is it potentionally dangerous to use global variables in a driver?

I believe that under microsoft operating systems, device drivers may use
global variables without fear of compromising the “kernel”. This is unlike
a Linux device driver, wherein use of global variables must be done *very*
carefully.

–Christine


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> ----------

From: xxxxx@PacificDigital.com[SMTP:xxxxx@PacificDigital.com]
Reply To: xxxxx@lists.osr.com
Sent: Tuesday, December 04, 2001 10:22 PM
To: xxxxx@lists.osr.com
Subject: [ntdev] RE: Global variables

> Is it potentionally dangerous to use global variables in a driver?

I believe that under microsoft operating systems, device drivers may use
global variables without fear of compromising the “kernel”. This is
unlike a Linux device driver, wherein use of global variables must be done
*very* carefully.

You’re right, there is no problem with globals under NT. Can you explain
what causes problem in Linux drivers? I’m just interested and don’t know too
much about Linux.

Thanks.

Best regards,

Michal Vodicka
STMicroelectronics Design and Application s.r.o.
[michal.vodicka@st.com, http:://www.st.com]


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> -----Original Message-----

From: Michal Vodicka [mailto:xxxxx@veridicom.cz.nospam]
Sent: Tuesday, December 04, 2001 1:41 PM

> >
> You’re right, there is no problem with globals under NT. Can
> you explain
> what causes problem in Linux drivers? I’m just interested and
> don’t know too
> much about Linux.
>
> Thanks.
>

The “short story” for those who are curious: Basically, global variables in
a device driver under Linux are global to the entire kernel (unless you
specifically state otherwise).

Harmony,

–Christine


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

RE: [ntdev] RE: Global variables"Christine Ames"
wrote in message news:xxxxx@ntdev…
> The “short story” for those who are curious: Basically, global variables
in a device driver under
> Linux are global to the entire kernel (unless you specifically state
otherwise).
>

Same thing in NT, right? There’s only one kernel mode mapping (modulo
hyper-space) and every device driver is in it.

Or am I missing the point that under Linux addresses are also automagically
exported and can hence be ref’ed by other things in the kernel?

Peter
OSR


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> I believe that under microsoft operating systems, device drivers may use

global variables without fear of compromising the “kernel”. This is
unlike a Linux device driver, wherein use of global variables must be done
*very* carefully.

xxxxx@veridicom.cz.nospam said:

You’re right, there is no problem with globals under NT. Can you
explain what causes problem in Linux drivers? I’m just interested and
don’t know too much about Linux.

xxxxx@PacificDigital.com said:

The “short story” for those who are curious:? Basically, global
variables in a device driver under Linux are global to the *entire
kernel* (unless you specifically state otherwise).

That’s true for drivers that are linked into the kernel, but for
loadable modules (the preferred method of writing drivers) global
symbols are not exported to other then other modules, and then only
if marked as exported. The EXPORT_SYMTAB and EXPORT_NO_SYMBOLS macros
control the general export “policy”, which is then adjusted as needed.
EXPORT_NO_SYMBOLS is the most common.

Individual symbols can be explicitly exported from modules into the
global scope of the kernel with EXPORT_SYMBOL macros, and modules can
be loaded that link to those exported symbols.

You really have quite a bit of control over what is exported to the
kernel namespace and what is not. And you can see what you get by
looking at /proc/ksyms.

Steve Williams “The woods are lovely, dark and deep.
steve at icarus.com But I have promises to keep,
steve at picturel.com and lines to code before I sleep,
http://www.picturel.com And lines to code before I sleep.”


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Peter,

Whenever a Linux kernel module is loaded, any global symbol becomes part of
the kernel symbol table, well, as long as you don’t use register_symtab() to
specify exactly what you want to export. Chapter 17 of Rubini’s book talks
about it. But register_symtab was there since Kernel 2.1, we’re in 2.4
today, so, it isn’t as bad as it looks !

Alberto.

-----Original Message-----
From: Peter Viscarola [mailto:xxxxx@osr.com]
Sent: Tuesday, December 04, 2001 5:32 PM
To: NT Developers Interest List
Subject: [ntdev] Re: Global variables

RE: [ntdev] RE: Global variables"Christine Ames"
wrote in message news:xxxxx@ntdev…
> The “short story” for those who are curious: Basically, global variables
in a device driver under
> Linux are global to the entire kernel (unless you specifically state
otherwise).
>

Same thing in NT, right? There’s only one kernel mode mapping (modulo
hyper-space) and every device driver is in it.

Or am I missing the point that under Linux addresses are also automagically
exported and can hence be ref’ed by other things in the kernel?

Peter
OSR


You are currently subscribed to ntdev as: xxxxx@compuware.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> -----Original Message-----

From: Stephen Williams [mailto:xxxxx@icarus.com]
Sent: Tuesday, December 04, 2001 2:36 PM


>
> xxxxx@PacificDigital.com said:
> > The “short story” for those who are curious:? Basically, global
> > variables in a device driver under Linux are global to the entire
> > kernel
(unless you specifically state otherwise).
>
> That’s true for drivers that are linked into the kernel, but for
> loadable modules (the preferred method of writing drivers) global
> symbols are not exported to other then other modules, and then only
> if marked as exported. The EXPORT_SYMTAB and EXPORT_NO_SYMBOLS macros
> control the general export “policy”, which is then adjusted as needed.
> EXPORT_NO_SYMBOLS is the most common.
>
> Individual symbols can be explicitly exported from modules into the
> global scope of the kernel with EXPORT_SYMBOL macros, and modules can
> be loaded that link to those exported symbols.
>
> You really have quite a bit of control over what is exported to the
> kernel namespace and what is not. And you can see what you get by
> looking at /proc/ksyms.

Thanks for the long story, Stephen.

I experimented with this (under 2.4.7) and my module global variables showed
up in /proc/ksyms without being explicitly exported. I’ve only been writing
drivers for Linux for a few months, but I thought /proc/ksyms was global to
the entire kernel? Am I missing something?

Harmony,

Christine


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> -----Original Message-----

From: Peter Viscarola [mailto:xxxxx@osr.com]
Sent: Tuesday, December 04, 2001 2:32 PM


> wrote in message news:xxxxx@ntdev…
> > The “short story” for those who are curious: Basically,
> global variables
> in a device driver under
> > Linux are global to the entire kernel (unless you
> specifically state
> otherwise).
> >
>
> Same thing in NT, right? There’s only one kernel mode mapping (modulo
> hyper-space) and every device driver is in it.
>
> Or am I missing the point that under Linux addresses are also
> automagically
> exported and can hence be ref’ed by other things in the kernel?
>
> Peter
> OSR

Hey Dude,

Yes, Peter, it is automagic. I don’t know about addresses, etc. but I do
know that as a “block” device driver I’m expected to “fill in”(<-very short
story) several global (yes, really global to the entire os) arrays that
are referenced, well, as if they were global. :wink:

–Christine


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Yes, if you have not synchronized access to them using spinlocks or mutexes.

Max

----- Original Message -----
From: “Slava Abramov”
To: “NT Developers Interest List”
Sent: Tuesday, December 04, 2001 10:03 PM
Subject: [ntdev] Global variables

> Is it potentionally dangerous to use global variables in a driver?
>
>
> Slava
>
> __________________________________________________
> Do You Yahoo!?
> Buy the perfect holiday gifts at Yahoo! Shopping.
> http://shopping.yahoo.com
>
> —
> You are currently subscribed to ntdev as: xxxxx@storagecraft.com
> To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
>


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

RE: [ntdev] Global variables>I believe that under microsoft operating systems, device drivers may use global variables

without fear of compromising the “kernel”. This is unlike a Linux device driver, wherein use
of global variables must be done *very* carefully.

Sorry, but why? Due to name clashing?
BTW, Christine, can you recommend a kernel debugger for Linux?

Max


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

xxxxx@PacificDigital.com said:

I experimented with this (under 2.4.7) and my module global variables
showed up in /proc/ksyms without being explicitly exported.? I’ve only
been writing drivers for Linux for a few months, but I thought /proc/
ksyms was global to the entire kernel?? Am I missing something?

if you do nothing at all with the symbols, then the default is to
add all the external symbols to the kernel symbol table. If you do
anything explicit with export management, it reverts to doing exactly
what is requested.

This is compatibility behavior.

Steve Williams “The woods are lovely, dark and deep.
steve at icarus.com But I have promises to keep,
steve at picturel.com and lines to code before I sleep,
http://www.picturel.com And lines to code before I sleep.”


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

> -----Original Message-----

From: Maxim S. Shatskih [mailto:xxxxx@storagecraft.com]
Sent: Tuesday, December 04, 2001 3:29 PM



> BTW, Christine, can you recommend a kernel debugger for Linux?
>

Linux kernel developers are discouraged from using debuggers, however you
can use gdb and kdb.

Debugging techniques (including the use of kdb) are discussed here:
http://www.xml.com/ldd/chapter/book/ch04.html

Note, however, the following quote from the above reference:

“The kdb Kernel Debugger

Many readers may be wondering why the kernel does not have any more advanced
debugging features built into it. The answer, quite simply, is that Linus
does not believe in interactive debuggers. He fears that they lead to poor
fixes, those which patch up symptoms rather than addressing the real cause
of problems. Thus, no built-in debuggers.

Other kernel developers, however, see an occasional use for interactive
debugging tools. One such tool is the kdb built-in kernel debugger,
available as a nonofficial patch from oss.sgi.com. To use kdb, you must
obtain the patch (be sure to get a version that matches your kernel
version), apply it, and rebuild and reinstall the kernel. Note that, as of
this writing, kdb works only on IA-32 (x86) systems (though a version for
the IA-64 existed for a while in the mainline kernel source before being
removed).”

Harmony,

Christine


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Yes sure, but this is a quality of ALL shared data structures, not
something peculiar to global data structures.

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Maxim
S. Shatskih
Sent: Tuesday, December 04, 2001 6:27 PM
To: NT Developers Interest List
Subject: [ntdev] Re: Global variables

Yes, if you have not synchronized access to them using
spinlocks or mutexes.

Max

----- Original Message -----
From: “Slava Abramov”
> To: “NT Developers Interest List”
> Sent: Tuesday, December 04, 2001 10:03 PM
> Subject: [ntdev] Global variables
>
>
> > Is it potentionally dangerous to use global variables in a driver?
> >
> >
> > Slava
> >
> > __________________________________________________
> > Do You Yahoo!?
> > Buy the perfect holiday gifts at Yahoo! Shopping.
> > http://shopping.yahoo.com
> >
> > —
> > You are currently subscribed to ntdev as: xxxxx@storagecraft.com To
> > unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
> >
>
>
> —
> You are currently subscribed to ntdev as:
> xxxxx@hollistech.com To unsubscribe send a blank email to
> leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
>
>


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Which confirms my unhappy opinion of linux.

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Christine Ames
Sent: Tuesday, December 04, 2001 9:07 PM
To: NT Developers Interest List
Subject: [ntdev] RE: Global variables

-----Original Message-----
From: Maxim S. Shatskih [mailto:xxxxx@storagecraft.com]
Sent: Tuesday, December 04, 2001 3:29 PM



> BTW, Christine, can you recommend a kernel debugger for Linux?
>

Linux kernel developers are discouraged from using debuggers, however
you can use gdb and kdb.

Debugging techniques (including the use of kdb) are discussed here:
http://www.xml.com/ldd/chapter/book/ch04.html

Note, however, the following quote from the above reference:

“The kdb Kernel Debugger

Many readers may be wondering why the kernel does not have any more
advanced debugging features built into it. The answer, quite simply, is
that Linus does not believe in interactive debuggers. He fears that they
lead to poor fixes, those which patch up symptoms rather than addressing
the real cause of problems. Thus, no built-in debuggers.

Other kernel developers, however, see an occasional use for interactive
debugging tools. One such tool is the kdb built-in kernel debugger,
available as a nonofficial patch from oss.sgi.com. To use kdb, you must
obtain the patch (be sure to get a version that matches your kernel
version), apply it, and rebuild and reinstall the kernel. Note that, as
of this writing, kdb works only on IA-32 (x86) systems (though a version
for the IA-64 existed for a while in the mainline kernel source before
being removed).”

Harmony,

Christine


You are currently subscribed to ntdev as: xxxxx@hollistech.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

RE: [ntdev] RE: Global variablesSee, all you NT driver developers, things
could be worse :slight_smile:

Seriously, relying solely on symbolic debuggers to remedy a poorly designed
driver will alway lead to less than desired results. On the other hand…

Jim
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com]On Behalf Of Christine Ames
Sent: Tuesday, December 04, 2001 6:07 PM
To: NT Developers Interest List
Subject: [ntdev] RE: Global variables

-----Original Message-----
> From: Maxim S. Shatskih [mailto:xxxxx@storagecraft.com]
> Sent: Tuesday, December 04, 2001 3:29 PM



> BTW, Christine, can you recommend a kernel debugger for Linux?
>

Linux kernel developers are discouraged from using debuggers, however you
can use gdb and kdb.

Debugging techniques (including the use of kdb) are discussed here:
http://www.xml.com/ldd/chapter/book/ch04.html

Note, however, the following quote from the above reference:

“The kdb Kernel Debugger

Many readers may be wondering why the kernel does not have any more
advanced debugging features built into it. The answer, quite simply, is that
Linus does not believe in interactive debuggers. He fears that they lead to
poor fixes, those which patch up symptoms rather than addressing the real
cause of problems. Thus, no built-in debuggers.

Other kernel developers, however, see an occasional use for interactive
debugging tools. One such tool is the kdb built-in kernel debugger,
available as a nonofficial patch from oss.sgi.com. To use kdb, you must
obtain the patch (be sure to get a version that matches your kernel
version), apply it, and rebuild and reinstall the kernel. Note that, as of
this writing, kdb works only on IA-32 (x86) systems (though a version for
the IA-64 existed for a while in the mainline kernel source before being
removed).”

Harmony,

Christine


You are currently subscribed to ntdev as: xxxxx@youngendeavors.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Yes, and gives me one more thing on my list of dumb things Linus has
said. Another favorite of mine is that zero copy IO is a bad
idea. Interactive debuggers are invaluable for tracing code and FINDING
the bug, and sure beats adding tons of debug prints, recompiling, and
running again many times. Once the bug has been found, no matter what
method was used to find it, fixing it is done the same way.

Anyhow, I found a really neat linux kernel debugger called private ice,
that is like softice, but it doesn’t seem to be maintained that
much. Iirc, it was at http://pice.sourceforge.net.

At 10:24 PM 12/4/2001 -0500, you wrote:

Which confirms my unhappy opinion of linux.


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

I believe Linus’s point was that if you have the source code, you can do
more than just single step through code. For example, you can insert your
own probes into the kernel, recompile it, and at least in theory you would
have a much more accurate diagnostic of what’s going on. Instead of single
stepping to see if this or that happens, just add code to the kernel to do
it for you. If I remember correctly, when asked about debugging, he told
someone, “use the source, dude”, and I can see the point. But I’m not
radical about it, using a debugger is often a good idea. But maybe
single-stepping is a bit overrated, I don’t know.

Alberto.

-----Original Message-----
From: Jim Young [mailto:xxxxx@youngendeavors.com]
Sent: Tuesday, December 04, 2001 10:21 PM
To: NT Developers Interest List
Subject: [ntdev] RE: Global variables

See, all you NT driver developers, things could be worse :slight_smile:

Seriously, relying solely on symbolic debuggers to remedy a poorly designed
driver will alway lead to less than desired results. On the other hand…

Jim

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com]On Behalf Of Christine Ames
Sent: Tuesday, December 04, 2001 6:07 PM
To: NT Developers Interest List
Subject: [ntdev] RE: Global variables

-----Original Message-----
From: Maxim S. Shatskih [ mailto:xxxxx@storagecraft.com
mailto:xxxxx ]
> Sent: Tuesday, December 04, 2001 3:29 PM



> BTW, Christine, can you recommend a kernel debugger for Linux?
>

Linux kernel developers are discouraged from using debuggers, however you
can use gdb and kdb.

Debugging techniques (including the use of kdb) are discussed here:
http://www.xml.com/ldd/chapter/book/ch04.html
http:

Note, however, the following quote from the above reference:

“The kdb Kernel Debugger

Many readers may be wondering why the kernel does not have any more advanced
debugging features built into it. The answer, quite simply, is that Linus
does not believe in interactive debuggers. He fears that they lead to poor
fixes, those which patch up symptoms rather than addressing the real cause
of problems. Thus, no built-in debuggers.

Other kernel developers, however, see an occasional use for interactive
debugging tools. One such tool is the kdb built-in kernel debugger,
available as a nonofficial patch from oss.sgi.com. To use kdb, you must
obtain the patch (be sure to get a version that matches your kernel
version), apply it, and rebuild and reinstall the kernel. Note that, as of
this writing, kdb works only on IA-32 (x86) systems (though a version for
the IA-64 existed for a while in the mainline kernel source before being
removed).”

Harmony,

Christine


You are currently subscribed to ntdev as: xxxxx@youngendeavors.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: xxxxx@compuware.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com</http:></mailto:xxxxx>