Can't acquire resource!

Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun


Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

------------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.
Anyone know why this is happening?
Thanks!
Dan Partelly wrote: Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy. Dan"Lijun Wang" wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

>> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

--------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

------------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

Perhaps some recursion caused your thread to acquire the ERESOURCE more than once? You have to release an ERESOURCE as many times as you acquire it.

-----Original Message-----
From: Lijun Wang [mailto:xxxxx@yahoo.com]
Sent: Tuesday, July 09, 2002 10:50 PM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan

“Lijun Wang” < xxxxx@yahoo.com> wrote in message news:xxxxx@ntfsd…

Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun



Do You Yahoo!?
New! SBC Yahoo! Dial http: - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial http: - 1st Month Free & unlimited access — You are currently subscribed to ntfsd as: xxxxx@inin.com To unsubscribe send a blank email to %%email.unsub%%</http:></http:>

Dan,
Sorry for the confusion. It happens in such a senario:
The resource was last succesfully locked in one thread, say, thread A, in an IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it was actually released (no owner). Then another thread, say, thread B, issued an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still locked by thread A, rendering thread B deadlocked for the resource.
This happens in a special occasion: a request IRP_MJ_CLEANUP for the last file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was never delivered although caching was not initiated at all. That makes me wondering who is still referencing the file object. I am not sure if the causes the above deadlock problem and if it does, why?
Also, this problem happens only on NT not on W2K.
Thanks.
Lijun
Dan Partelly wrote: >> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.“Lijun Wang” wrote in message news:xxxxx@ntfsd…
I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.
Anyone know why this is happening?
Thanks!
Dan Partelly wrote: Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy. Dan"Lijun Wang" wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

I think this design is broken. What are you trying to accomplish?

-----Original Message-----
From: Lijun Wang [mailto:xxxxx@yahoo.com]
Sent: Wednesday, July 10, 2002 9:36 AM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

Dan,

Sorry for the confusion. It happens in such a senario:

The resource was last succesfully locked in one thread, say, thread A, in an IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it was actually released (no owner). Then another thread, say, thread B, issued an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still locked by thread A, rendering thread B deadlocked for the resource.

This happens in a special occasion: a request IRP_MJ_CLEANUP for the last file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was never delivered although caching was not initiated at all. That makes me wondering who is still referencing the file object. I am not sure if the causes the above deadlock problem and if it does, why?

Also, this problem happens only on NT not on W2K.

Thanks.

Lijun

Dan Partelly wrote:

>> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.

“Lijun Wang” < xxxxx@yahoo.com> wrote in message news:xxxxx@ntfsd…

I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan

“Lijun Wang” < xxxxx@yahoo.com> wrote in message news:xxxxx@ntfsd…

Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun



Do You Yahoo!?
New! SBC Yahoo! Dial http: - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial http: - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

_____

Do You Yahoo!?
New! SBC Yahoo! Dial http: - 1st Month Free & unlimited access — You are currently subscribed to ntfsd as: xxxxx@inin.com To unsubscribe send a blank email to %%email.unsub%%</http:></http:></http:>

Somewhere , in between, something happens which makes the resource to be acquired again , and never released. Windbg is preety acurate in dumping ERESOURCE objects. Are you by any chanche acquiring the resource and hold it untill IoCompletion occures or something like that ?

“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Dan,

Sorry for the confusion. It happens in such a senario:

The resource was last succesfully locked in one thread, say, thread A, in an IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it was actually released (no owner). Then another thread, say, thread B, issued an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still locked by thread A, rendering thread B deadlocked for the resource.

This happens in a special occasion: a request IRP_MJ_CLEANUP for the last file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was never delivered although caching was not initiated at all. That makes me wondering who is still referencing the file object. I am not sure if the causes the above deadlock problem and if it does, why?

Also, this problem happens only on NT not on W2K.

Thanks.

Lijun

Dan Partelly wrote:

>> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

----------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

--------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

------------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

I am implmenting the redirector in C++. The resource was being acquired and released through a member function only. By monitoring the lock function, I am pretty sure it was not locked in between the two event. Since I don’t have another machine, I can’t use Windbg to debug it in real time. In stead, I ouput the information about the resource by writing to a file.
Following is the code managing the resource. Anything wrong with it?
Lijun
LLFsd_SynConnection::LLFsd_SynConnection(
LLFsd_Driver * driver,
PDEVICE_OBJECT driverDevice,
PDEVICE_OBJECT transport,
PFILE_OBJECT TransportFile):
LLFsd_Connection(driver, driverDevice, transport, TransportFile)
{
LilyZeroMemory(&m_Resource, sizeof(ERESOURCE));
ExInitializeResourceLite(&m_Resource);
}
LLFsd_SynConnection::~LLFsd_SynConnection()
{
// release resource…
//UnLock();
ExDeleteResourceLite(&m_Resource);
}
bool LLFsd_SynConnection::Lock(bool bExclusive /*= true */, bool bWait /*= true*/)
{
#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “Lock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif
if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}
BOOLEAN bAcquired = false;
{
if(bExclusive) {
bAcquired = ExAcquireResourceExclusiveLite(&m_Resource, bWait);
}
else {
bAcquired = ExAcquireResourceSharedLite(&m_Resource, bWait);
}
}
#ifdef LOG_DEBUG
sprintf(mess, “[ LLFsd_SynConnection: Locked, Thread %p\n”, ExGetCurrentResourceThread());
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif
return (bAcquired != 0);
}
// IRQL <= DISPATCH_LEVEL.
void LLFsd_SynConnection::UnLock()
{
ExReleaseResourceForThreadLite(&m_Resource,
ExGetCurrentResourceThread());
#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “] LLFsd_SynConnection: UnLock, Thread %p releaed %d\n”,
ExGetCurrentResourceThread(),
!ExIsResourceAcquiredExclusiveLite(&m_Resource));
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
sprintf(mess, “After Unlock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif
}

Dan Partelly wrote: Somewhere , in between, something happens which makes the resource to be acquired again , and never released. Windbg is preety acurate in dumping ERESOURCE objects. Are you by any chanche acquiring the resource and hold it untill IoCompletion occures or something like that ? “Lijun Wang” wrote in message news:xxxxx@ntfsd…
Dan,
Sorry for the confusion. It happens in such a senario:
The resource was last succesfully locked in one thread, say, thread A, in an IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it was actually released (no owner). Then another thread, say, thread B, issued an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still locked by thread A, rendering thread B deadlocked for the resource.
This happens in a special occasion: a request IRP_MJ_CLEANUP for the last file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was never delivered although caching was not initiated at all. That makes me wondering who is still referencing the file object. I am not sure if the causes the above deadlock problem and if it does, why?
Also, this problem happens only on NT not on W2K.
Thanks.
Lijun
Dan Partelly wrote: >> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.“Lijun Wang” wrote in message news:xxxxx@ntfsd…
I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.
Anyone know why this is happening?
Thanks!
Dan Partelly wrote: Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy. Dan"Lijun Wang" wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access—
You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

Lijun,

I think there’s several problems here with the general development strategy
you just outlined:

(1) You don’t have the ability to debug. You don’t need another machine
anymore. Try using VMware (http://www.vmware.com http:</http:> )
and debug it that way. It isn’t pefect, but it will allow you to debug
using WinDBG and one machine. There’s an article in the current NT Insider
describing this technique. Alternatively, use SoftICE.

(2) You probably aren’t using the checked build, are you…

(3) Is it possible that you DO something between you "lock’ and “unlock”
call? If so, it is certainly possible that there is an exception being
thrown that you do not properly handle. For example, if you use work
queues, they will catch the exception but will not free up your ERESOURCE.
This is the kind of thing that would be caught by the checked build.

(4) Did you at least try doing a DbgPrint every time you lock and unlock
the ERESOURCE? At least that way you could SEE if there is a case you
aren’t covering properly. And this only requires DbgMon.

Of course there’s nothing wrong with the locking code - the problem most
likely lies somewhere OTHER than where you are looking.

Regards,

Tony

Tony Mason

Consulting Partner

OSR Open Systems Resources, Inc.

http: http://www.osr.com

Hope to see you at the next OSR file systems class in San Jose, CA September
16, 2002!

-----Original Message-----
From: Lijun Wang [mailto:xxxxx@yahoo.com]
Sent: Wednesday, July 10, 2002 11:29 AM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

I am implmenting the redirector in C++. The resource was being acquired and
released through a member function only. By monitoring the lock function, I
am pretty sure it was not locked in between the two event. Since I don’t
have another machine, I can’t use Windbg to debug it in real time. In stead,
I ouput the information about the resource by writing to a file.

Following is the code managing the resource. Anything wrong with it?

Lijun

LLFsd_SynConnection::LLFsd_SynConnection(
LLFsd_Driver * driver,
PDEVICE_OBJECT driverDevice,
PDEVICE_OBJECT transport,
PFILE_OBJECT TransportFile):
LLFsd_Connection(driver, driverDevice, transport, TransportFile)
{
LilyZeroMemory(&m_Resource, sizeof(ERESOURCE));
ExInitializeResourceLite(&m_Resource);
}

LLFsd_SynConnection::~LLFsd_SynConnection()
{
// release resource…
//UnLock();
ExDeleteResourceLite(&m_Resource);
}

bool LLFsd_SynConnection::Lock(bool bExclusive /= true /, bool bWait /=
true
/)
{
#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “Lock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}

BOOLEAN bAcquired = false;
{
if(bExclusive) {
bAcquired = ExAcquireResourceExclusiveLite(&m_Resource, bWait);
}
else {
bAcquired = ExAcquireResourceSharedLite(&m_Resource, bWait);
}
}
#ifdef LOG_DEBUG
sprintf(mess, “[LLFsd_SynConnection: Locked, Thread %p\n”,
ExGetCurrentResourceThread());
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

return (bAcquired != 0);
}

// IRQL <= DISPATCH_LEVEL.
void LLFsd_SynConnection::UnLock()
{

ExReleaseResourceForThreadLite(&m_Resource,
ExGetCurrentResourceThread());

#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “] LLFsd_SynConnection: UnLock, Thread %p releaed %d\n”,
ExGetCurrentResourceThread(),
!ExIsResourceAcquiredExclusiveLite(&m_Resource));
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

sprintf(mess, “After Unlock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

#endif
}

Dan Partelly wrote:

Somewhere , in between, something happens which makes the resource to be
acquired again , and never released. Windbg is preety acurate in dumping
ERESOURCE objects. Are you by any chanche acquiring the resource and hold it
untill IoCompletion occures or something like that ?

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

Dan,

Sorry for the confusion. It happens in such a senario:

The resource was last succesfully locked in one thread, say, thread A, in an
IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it
was actually released (no owner). Then another thread, say, thread B, issued
an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still
locked by thread A, rendering thread B deadlocked for the resource.

This happens in a special occasion: a request IRP_MJ_CLEANUP for the last
file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was
never delivered although caching was not initiated at all. That makes me
wondering who is still referencing the file object. I am not sure if the
causes the above deadlock problem and if it does, why?

Also, this problem happens only on NT not on W2K.

Thanks.

Lijun

Dan Partelly wrote:

>> and found although I the lock on the resouce was released in another
thread, but in another thread, the dump shows it was >> still locked by the
earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what
scenario you have.

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

I dumped out the ERESOURCE and found although I the lock on the resouce was
released in another thread, but in another thread, the dump shows it was
still locked by the earlier thread. This is very strange! I checked before
lock a resource I called KeEnterCritialRegion and after release called
KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state,
and see if indeed there is no current owner of the resource. You can use
!locks command in windbg. Also, check if you corectly use
KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion()
after you release. Failure to disable normal kernel APCs can cause
reenteracy , thus compromise the integrity of locks hierarchy.

Dan

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

Hi All,

I am using an ERESOURCE to synchronize all the output to a network
connection in my redirector. I met a very strange problem with the resource.
At some point I can’t acquire the resource using
ExAcquireResourceExclusiveLite even I am pretty sure I release every
previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was
received but the IRP_MJ_CLOSE was never delivered on that file object
(caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access — You are currently
subscribed to ntfsd as: xxxxx@osr.com To unsubscribe send a blank email to
%%email.unsub%%</http:></http:></http:></http:></news:xxxxx></news:xxxxx></news:xxxxx></http:>

Dumping the state of a resource or locking at any members whithout acquiring its internal locks is kinda unsafe. Use a debugger , and dont relay on dbg prits for serious debugging. I cant figure out what happnes there from your code. As Rob says , your design is most likely broken.
----- Original Message -----
From: Lijun Wang
To: File Systems Developers
Sent: Wednesday, July 10, 2002 6:29 PM
Subject: [ntfsd] Re: Can’t acquire resource!

I am implmenting the redirector in C++. The resource was being acquired and released through a member function only. By monitoring the lock function, I am pretty sure it was not locked in between the two event. Since I don’t have another machine, I can’t use Windbg to debug it in real time. In stead, I ouput the information about the resource by writing to a file.

Following is the code managing the resource. Anything wrong with it?

Lijun

LLFsd_SynConnection::LLFsd_SynConnection(
LLFsd_Driver * driver,
PDEVICE_OBJECT driverDevice,
PDEVICE_OBJECT transport,
PFILE_OBJECT TransportFile):
LLFsd_Connection(driver, driverDevice, transport, TransportFile)
{
LilyZeroMemory(&m_Resource, sizeof(ERESOURCE));
ExInitializeResourceLite(&m_Resource);
}

LLFsd_SynConnection::~LLFsd_SynConnection()
{
// release resource…
//UnLock();
ExDeleteResourceLite(&m_Resource);
}

bool LLFsd_SynConnection::Lock(bool bExclusive /*= true */, bool bWait /*= true*/)
{
#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “Lock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}

BOOLEAN bAcquired = false;
{
if(bExclusive) {
bAcquired = ExAcquireResourceExclusiveLite(&m_Resource, bWait);
}
else {
bAcquired = ExAcquireResourceSharedLite(&m_Resource, bWait);
}
}
#ifdef LOG_DEBUG
sprintf(mess, “[ LLFsd_SynConnection: Locked, Thread %p\n”, ExGetCurrentResourceThread());
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

return (bAcquired != 0);
}

// IRQL <= DISPATCH_LEVEL.
void LLFsd_SynConnection::UnLock()
{

ExReleaseResourceForThreadLite(&m_Resource,
ExGetCurrentResourceThread());

#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “] LLFsd_SynConnection: UnLock, Thread %p releaed %d\n”,
ExGetCurrentResourceThread(),
!ExIsResourceAcquiredExclusiveLite(&m_Resource));
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

sprintf(mess, “After Unlock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

#endif
}

Dan Partelly wrote:

Somewhere , in between, something happens which makes the resource to be acquired again , and never released. Windbg is preety acurate in dumping ERESOURCE objects. Are you by any chanche acquiring the resource and hold it untill IoCompletion occures or something like that ?

“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Dan,

Sorry for the confusion. It happens in such a senario:

The resource was last succesfully locked in one thread, say, thread A, in an IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it was actually released (no owner). Then another thread, say, thread B, issued an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still locked by thread A, rendering thread B deadlocked for the resource.

This happens in a special occasion: a request IRP_MJ_CLEANUP for the last file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was never delivered although caching was not initiated at all. That makes me wondering who is still referencing the file object. I am not sure if the causes the above deadlock problem and if it does, why?

Also, this problem happens only on NT not on W2K.

Thanks.

Lijun

Dan Partelly wrote:

>> and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was >> still locked by the earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what scenario you have.
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
I dumped out the ERESOURCE and found although I the lock on the resouce was released in another thread, but in another thread, the dump shows it was still locked by the earlier thread. This is very strange! I checked before lock a resource I called KeEnterCritialRegion and after release called KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state, and see if indeed there is no current owner of the resource. You can use !locks command in windbg. Also, check if you corectly use KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion() after you release. Failure to disable normal kernel APCs can cause reenteracy , thus compromise the integrity of locks hierarchy.

Dan
“Lijun Wang” wrote in message news:xxxxx@ntfsd…
Hi All,

I am using an ERESOURCE to synchronize all the output to a network connection in my redirector. I met a very strange problem with the resource. At some point I can’t acquire the resource using ExAcquireResourceExclusiveLite even I am pretty sure I release every previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was received but the IRP_MJ_CLOSE was never delivered on that file object (caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun

------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

----------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

--------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%

------------------------------------------------------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access — You are currently subscribed to ntfsd as: xxxxx@rdsor.ro To unsubscribe send a blank email to %%email.unsub%%

There’s at least one problem with this code snippet. Consider the following lines in the function “bool LLFsd_SynConnection::lock:

if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}

Neither the caller or the *cough* C++ object knows whether or not Unlock needs to be called. I wonder what happens if you unlock an ERESOURCE too many times.

Regardless, I’m sure there is a design problem as well. Holding a lock from IRP_MJ_CLEANUP to IRP_MJ_CLOSE doesn’t seem like a good idea, regardless of the caching state. If you tell us what you’re trying to accomplish, we might be able to help.

-----Original Message-----
From: Tony Mason [mailto:xxxxx@osr.com]
Sent: Wednesday, July 10, 2002 10:47 AM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

Lijun,

I think there’s several problems here with the general development strategy
you just outlined:

(1) You don’t have the ability to debug. You don’t need another machine
anymore. Try using VMware (http://www.vmware.com http:</http:> )
and debug it that way. It isn’t pefect, but it will allow you to debug
using WinDBG and one machine. There’s an article in the current NT Insider
describing this technique. Alternatively, use SoftICE.

(2) You probably aren’t using the checked build, are you…

(3) Is it possible that you DO something between you "lock’ and “unlock”
call? If so, it is certainly possible that there is an exception being
thrown that you do not properly handle. For example, if you use work
queues, they will catch the exception but will not free up your ERESOURCE.
This is the kind of thing that would be caught by the checked build.

(4) Did you at least try doing a DbgPrint every time you lock and unlock
the ERESOURCE? At least that way you could SEE if there is a case you
aren’t covering properly. And this only requires DbgMon.

Of course there’s nothing wrong with the locking code - the problem most
likely lies somewhere OTHER than where you are looking.

Regards,

Tony

Tony Mason

Consulting Partner

OSR Open Systems Resources, Inc.

http: http://www.osr.com

Hope to see you at the next OSR file systems class in San Jose, CA September
16, 2002!

-----Original Message-----
From: Lijun Wang [mailto:xxxxx@yahoo.com]
Sent: Wednesday, July 10, 2002 11:29 AM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

I am implmenting the redirector in C++. The resource was being acquired and
released through a member function only. By monitoring the lock function, I
am pretty sure it was not locked in between the two event. Since I don’t
have another machine, I can’t use Windbg to debug it in real time. In stead,
I ouput the information about the resource by writing to a file.

Following is the code managing the resource. Anything wrong with it?

Lijun

LLFsd_SynConnection::LLFsd_SynConnection(
LLFsd_Driver * driver,
PDEVICE_OBJECT driverDevice,
PDEVICE_OBJECT transport,
PFILE_OBJECT TransportFile):
LLFsd_Connection(driver, driverDevice, transport, TransportFile)
{
LilyZeroMemory(&m_Resource, sizeof(ERESOURCE));
ExInitializeResourceLite(&m_Resource);
}

LLFsd_SynConnection::~LLFsd_SynConnection()
{
// release resource…
//UnLock();
ExDeleteResourceLite(&m_Resource);
}

bool LLFsd_SynConnection::Lock(bool bExclusive /= true /, bool bWait /=
true
/)
{
#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “Lock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}

BOOLEAN bAcquired = false;
{
if(bExclusive) {
bAcquired = ExAcquireResourceExclusiveLite(&m_Resource, bWait);
}
else {
bAcquired = ExAcquireResourceSharedLite(&m_Resource, bWait);
}
}
#ifdef LOG_DEBUG
sprintf(mess, “[LLFsd_SynConnection: Locked, Thread %p\n”,
ExGetCurrentResourceThread());
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);
#endif

return (bAcquired != 0);
}

// IRQL <= DISPATCH_LEVEL.
void LLFsd_SynConnection::UnLock()
{

ExReleaseResourceForThreadLite(&m_Resource,
ExGetCurrentResourceThread());

#ifdef LOG_DEBUG
char mess[1024];
sprintf(mess, “] LLFsd_SynConnection: UnLock, Thread %p releaed %d\n”,
ExGetCurrentResourceThread(),
!ExIsResourceAcquiredExclusiveLite(&m_Resource));
LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

sprintf(mess, “After Unlock: Owner Thread %p %p %p %d\n”,
m_Resource.OwnerThreads[0].OwnerThread,
m_Resource.OwnerThreads[1].OwnerThread,
m_Resource.OwnerTable,
m_Resource.ActiveCount);

LLFsdLog(mess, LLFSD_GLOBAL_DATA.logfile);

#endif
}

Dan Partelly wrote:

Somewhere , in between, something happens which makes the resource to be
acquired again , and never released. Windbg is preety acurate in dumping
ERESOURCE objects. Are you by any chanche acquiring the resource and hold it
untill IoCompletion occures or something like that ?

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

Dan,

Sorry for the confusion. It happens in such a senario:

The resource was last succesfully locked in one thread, say, thread A, in an
IRP_MJ_QUERY_INFORMATION request then released. Dump from thread A shows it
was actually released (no owner). Then another thread, say, thread B, issued
an IRP_MJ_CREATE. Dump before acquiring the resource shows it was still
locked by thread A, rendering thread B deadlocked for the resource.

This happens in a special occasion: a request IRP_MJ_CLEANUP for the last
file opened by thread A was received, but its corresponding IRP_MJ_CLOSE was
never delivered although caching was not initiated at all. That makes me
wondering who is still referencing the file object. I am not sure if the
causes the above deadlock problem and if it does, why?

Also, this problem happens only on NT not on W2K.

Thanks.

Lijun

Dan Partelly wrote:

>> and found although I the lock on the resouce was released in another
thread, but in another thread, the dump shows it was >> still locked by the
earlier thread

Can you please clear this phrase a bit ? Im not sure I understand what
scenario you have.

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

I dumped out the ERESOURCE and found although I the lock on the resouce was
released in another thread, but in another thread, the dump shows it was
still locked by the earlier thread. This is very strange! I checked before
lock a resource I called KeEnterCritialRegion and after release called
KeExitCritialRegion.

Anyone know why this is happening?

Thanks!

Dan Partelly wrote:

Break into the debugger just before this, and the dump the ERESOUCE state,
and see if indeed there is no current owner of the resource. You can use
!locks command in windbg. Also, check if you corectly use
KeEnterCritialRegion() before any aquisition & KeLeaveCriticalRegion()
after you release. Failure to disable normal kernel APCs can cause
reenteracy , thus compromise the integrity of locks hierarchy.

Dan

“Lijun Wang” > wrote in
message news:xxxxx@ntfsd news:xxxxx

Hi All,

I am using an ERESOURCE to synchronize all the output to a network
connection in my redirector. I met a very strange problem with the resource.
At some point I can’t acquire the resource using
ExAcquireResourceExclusiveLite even I am pretty sure I release every
previous lock to the resource.

This problem happens when a file was created then IRP_MJ_CLEANUP was
received but the IRP_MJ_CLOSE was never delivered on that file object
(caching on that file is never initiated).

Does anyone encountered this kind of problem before??

Lijun



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access


You are currently subscribed to ntfsd as: xxxxx@yahoo.com
To unsubscribe send a blank email to %%email.unsub%%



Do You Yahoo!?
New! SBC Yahoo! Dial
http:c.yahoo.com> - 1st Month Free & unlimited access — You are currently
subscribed to ntfsd as: xxxxx@osr.com To unsubscribe send a blank email to
%%email.unsub%%


You are currently subscribed to ntfsd as: xxxxx@inin.com
To unsubscribe send a blank email to %%email.unsub%%</http:></http:></http:></http:></news:xxxxx></news:xxxxx></news:xxxxx></http:>

Hi Bob,
Thanks for your suggestions. I agree there must be some problem with my desgin since this is my first taking on driver development. I am totally a newbie.
Essentialy I am writing a redirector which interfaces between local applications and the remote file server. The redirector communicates with the server via TDI. Right now I’m trying to simplify the implementation by serialize all the communication between the redirector and the server. That is why I use a ERESOURCE to do the serialization. I tried MUTEX but that totally disrupted calls to TDI.
What other sychronization primitive can I use? I need to lock the resource then do input/output through the connection then release it to allow other requests to proceed.
I did not touch the resource at all in cleanup & close.
Lijun

“Fuller, Rob” wrote: There’s at least one problem with this code snippet. Consider the following lines in the function “bool LLFsd_SynConnection::lock:

if(ExIsResourceAcquiredExclusiveLite(&m_Resource)) {
return true;
}

Neither the caller or the cough C++ object knows whether or not Unlock needs to be called. I wonder what happens if you unlock an ERESOURCE too many times.

Regardless, I’m sure there is a design problem as well. Holding a lock from IRP_MJ_CLEANUP to IRP_MJ_CLOSE doesn’t seem like a good idea, regardless of the caching state. If you tell us what you’re trying to accomplish, we might be able to help.

-----Original Message-----
From: Tony Mason [mailto:xxxxx@osr.com]
Sent: Wednesday, July 10, 2002 10:47 AM
To: File Systems Developers
Subject: [ntfsd] Re: Can’t acquire resource!

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access

Tony,
Thanks a lot for your invaluable information. I was using VMWare 3.0 actually. Now after upgrading to 3.1. I am able to debug it live.
Regard!
Lijun

Tony Mason wrote: Lijun,

I think there’s several problems here with the general development strategy
you just outlined:

(1) You don’t have the ability to debug. You don’t need another machine
anymore. Try using VMware (http://www.vmware.com )
and debug it that way. It isn’t pefect, but it will allow you to debug
using WinDBG and one machine. There’s an article in the current NT Insider
describing this technique. Alternatively, use SoftICE.

(2) You probably aren’t using the checked build, are you…

(3) Is it possible that you DO something between you "lock’ and “unlock”
call? If so, it is certainly possible that there is an exception being
thrown that you do not properly handle. For example, if you use work
queues, they will catch the exception but will not free up your ERESOURCE.
This is the kind of thing that would be caught by the checked build.

(4) Did you at least try doing a DbgPrint every time you lock and unlock
the ERESOURCE? At least that way you could SEE if there is a case you
aren’t covering properly. And this only requires DbgMon.

Of course there’s nothing wrong with the locking code - the problem most
likely lies somewhere OTHER than where you are looking.

Regards,

Tony

Tony Mason

Consulting Partner

OSR Open Systems Resources, Inc.

http://www.osr.com

Hope to see you at the next OSR file systems class in San Jose, CA September
16, 2002!

---------------------------------
Do You Yahoo!?
New! SBC Yahoo! Dial - 1st Month Free & unlimited access