DeviceIoControl的时候createfile失败GetLastError=5

pasdtniuren 2009-08-31 12:28:31
我想在win32下检测PC上的可移动磁盘,参照http://www.freeors.com/bbs/viewthread.php?tid=506做了一下
可是实现的时候有问题,就是createfile失败GetLastError=5(拒绝访问,我手动建立文件是没有问题的),谁给分析下是什么原因造成的?
参见下面代码
	
LPCTSTR sDrivePath = s;
UINT DiskType =GetDriveType(sDrivePath);
switch(DiskType)
{
case DRIVE_NO_ROOT_DIR:
return;
case DRIVE_REMOVABLE:

strSDDirver = sDrivePath;
sprintf(chDeviceName, "\\\\.\\%c:", 'G');//SD卡所在盘符
hDevice = CreateFile
(chDeviceName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);
int i = GetLastError();//错误码 5


if (hDevice != INVALID_HANDLE_VALUE) {

if (DeviceIoControl(
hDevice,
IOCTL_STORAGE_CHECK_VERIFY,
NULL,
0,
NULL,
0,
&cbBytesAct,
NULL))
{
....
}
...
}
...全文
1631 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjyffc 2010-09-26
我也遇到这个问题。

是因为Smart Card这个服务没有启动,在“开始菜单”->“所有程序”->“管理工具”->“服务”中启动这个服务就好了。
回复
weiyuxingkong 2010-03-09
LET ME SEE
回复
qinglianjushi 2009-12-04
pasdtniuren:
您好!请问您的问题解决了吗?我也遇到了类似的问题.
回复
pasdtniuren 2009-08-31
[Quote=引用 6 楼 tr0j4n 的回复:]
首先,建立资源管理器的上下文
C/C++ code
SCARDCONTEXT hSC;
LONG lReturn;
lReturn= SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL,&hSC);if ( lReturn!=SCARD_S_SUCCESS )
printf("Failed SCardEstablishContext\n");
[/Quote]
SCardEstablishContext 失败了,返回值-2146435043(SCARD_E_NO_SERVICE)
SCARD_E_NO_SERVICE The smart card resource manager is not running.
原因不明。。。
回复
MoXiaoRab 2009-08-31
首先,建立资源管理器的上下文

SCARDCONTEXT hSC;
LONG lReturn;
lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
if ( lReturn!=SCARD_S_SUCCESS )
printf("Failed SCardEstablishContext\n");


获得系统中安装的读卡器列表
下面是获得系统中安装的读卡器列表的代码:
char            mszReaders[1024];
LPTSTR pReader, pReaderName[2];
DWORD dwLen=sizeof(mzsReaders);
int nReaders=0;
lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);
if ( lReturn==SCARD_S_SUCCESS )
{
pReader = (LPTSTR)pmszReaders;
while (*pReader !='\0' )
{
if ( nReaders<2 ) //使用系统中前2个读卡器
pReaderName[nReaders++]=pReader;
printf("Reader: %S\n", pReader );
//下一个读卡器名
pReader = pReader + strlen(pReader) + 1;
}
}

与读卡器(智能卡)连接

SCARDHANDLE hCardHandle[2];
DWORD dwAP;
lReturn = SCardConnect( hContext, pReaderName[0], SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP );
if ( lReturn!=SCARD_S_SUCCESS )
{
printf("Failed SCardConnect\n");
exit(1);
}

LONG SCardConnect(
SCARDCONTEXT hContext,
LPCTSTR szReader,
DWORD dwShareMode,
DWORD dwPreferredProtocols,
LPSCARDHANDLE phCard,
LPDWORD pdwActiveProtocol
);

各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。(5)phCard:输出类型;与智能卡连接的句柄。(6)PdwActiveProtocol:输出类型;实际使用的协议。

如果连接不上,说明就没有插入

回复
pasdtniuren 2009-08-31
[Quote=引用 4 楼 dirdirdir3 的回复:]
The caller must have administrative privileges for the operation to succeed on a hard disk drive.
The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:


要有管理员的权限.......
[/Quote]
要是没有管理员权限,还想使用这个函数来判断读卡器中是否有SD卡,要怎么做?
回复
dirdirdir3 2009-08-31
The caller must have administrative privileges for the operation to succeed on a hard disk drive.
The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:


要有管理员的权限.......
回复
MoXiaoRab 2009-08-31
在Ring3下直接访问硬件获得设备句柄需要提升权限,你可以尝试提升Debug权限。

BOOL EnablePrivilege(LPCSTR lpName, BOOL fEnable)
{
HANDLE hObject;
LUID Luid;
TOKEN_PRIVILEGES NewStatus;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hObject))
return FALSE;

if (LookupPrivilegeValue(NULL, lpName, &Luid))
{
NewStatus.Privileges[0].Luid = Luid;
NewStatus.PrivilegeCount = 1;
NewStatus.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

AdjustTokenPrivileges(hObject, FALSE, &NewStatus, 0, 0, 0);

CloseHandle(hObject);
return TRUE;
}

return FALSE;
}

调用方式 EnablePrivilege(SE_DEBUG_NAME,TRUE);
回复
ziplj 2009-08-31
我在内核编程里面才用过\\.\ 这种格式
不知道应用程序也有这种格式???
回复
ziplj 2009-08-31
你盘符写对了吗??
\\.\G: ??

你试试G:\
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告