void GetClientNetbiosName (LPTSTR pszName) { static TCHAR szNetbiosName[32] = ""; if ( szNetbiosName[0] == 0 ) { lana_GetNetbiosName(szNetbiosName, LANA_NETBIOS_NAME_FULL); } _tcscpy(pszName, szNetbiosName); }
static long GetIoctlHandle(char *fileNamep, HANDLE * handlep) { HKEY hk; char *drivep = NULL; char netbiosName[MAX_NB_NAME_LENGTH]="AFS"; DWORD CurrentState = 0; char HostName[64] = ""; char tbuffer[MAX_PATH]=""; HANDLE fh; char szUser[128] = ""; char szClient[MAX_PATH] = ""; char szPath[MAX_PATH] = ""; NETRESOURCE nr; DWORD res; DWORD ioctlDebug = IoctlDebug(); DWORD gle; DWORD dwAttrib; DWORD dwSize = sizeof(szUser); BOOL usingRDR = FALSE; int saveerrno; UINT driveType; int sharingViolation; memset(HostName, '\0', sizeof(HostName)); gethostname(HostName, sizeof(HostName)); if (!DisableServiceManagerCheck() && GetServiceStatus(HostName, TEXT("TransarcAFSDaemon"), &CurrentState) == NOERROR && CurrentState != SERVICE_RUNNING) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl GetServiceStatus(%s) == %d\r\n", HostName, CurrentState); errno = saveerrno; } return -1; } if (RDR_Ready()) { usingRDR = TRUE; if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl Redirector is ready\r\n"); errno = saveerrno; } if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, &hk) == 0) { DWORD dwSize = sizeof(netbiosName); DWORD dwType = REG_SZ; RegQueryValueExA (hk, "NetbiosName", NULL, &dwType, (PBYTE)netbiosName, &dwSize); RegCloseKey (hk); if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl NetbiosName = \"%s\"\r\n", netbiosName); errno = saveerrno; } } else { if ( ioctlDebug ) { saveerrno = errno; gle = GetLastError(); fprintf(stderr, "pioctl Unable to open \"HKLM\\%s\" using NetbiosName = \"AFS\" GLE=0x%x\r\n", HostName, CurrentState, gle); errno = saveerrno; } } } else { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl Redirector is not ready\r\n"); errno = saveerrno; } if (!GetEnvironmentVariable("AFS_PIOCTL_SERVER", netbiosName, sizeof(netbiosName))) lana_GetNetbiosName(netbiosName,LANA_NETBIOS_NAME_FULL); if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl NetbiosName = \"%s\"\r\n", netbiosName); errno = saveerrno; } } if (fileNamep) { drivep = strchr(fileNamep, ':'); if (drivep && (drivep - fileNamep) >= 1) { tbuffer[0] = *(drivep - 1); tbuffer[1] = ':'; tbuffer[2] = '\0'; driveType = GetDriveType(tbuffer); switch (driveType) { case DRIVE_UNKNOWN: case DRIVE_REMOTE: if (DriveIsMappedToAFS(tbuffer, netbiosName) || DriveIsGlobalAutoMapped(tbuffer)) strcpy(&tbuffer[2], SMB_IOCTL_FILENAME); else return -1; break; default: if (DriveIsGlobalAutoMapped(tbuffer)) strcpy(&tbuffer[2], SMB_IOCTL_FILENAME); else return -1; } } else if (fileNamep[0] == fileNamep[1] && (fileNamep[0] == '\\' || fileNamep[0] == '/')) { int count = 0, i = 0; while (count < 4 && fileNamep[i]) { tbuffer[i] = fileNamep[i]; if ( tbuffer[i] == '\\' || tbuffer[i] == '/') count++; i++; } if (fileNamep[i] == 0 || (fileNamep[i-1] != '\\' && fileNamep[i-1] != '/')) tbuffer[i++] = '\\'; tbuffer[i] = 0; strcat(tbuffer, SMB_IOCTL_FILENAME_NOSLASH); } else { char curdir[MAX_PATH]=""; GetCurrentDirectory(sizeof(curdir), curdir); if ( curdir[1] == ':' ) { tbuffer[0] = curdir[0]; tbuffer[1] = ':'; tbuffer[2] = '\0'; driveType = GetDriveType(tbuffer); switch (driveType) { case DRIVE_UNKNOWN: case DRIVE_REMOTE: if (DriveIsMappedToAFS(tbuffer, netbiosName) || DriveIsGlobalAutoMapped(tbuffer)) strcpy(&tbuffer[2], SMB_IOCTL_FILENAME); else return -1; break; default: if (DriveIsGlobalAutoMapped(tbuffer)) strcpy(&tbuffer[2], SMB_IOCTL_FILENAME); else return -1; } } else if (curdir[0] == curdir[1] && (curdir[0] == '\\' || curdir[0] == '/')) { int count = 0, i = 0; while (count < 4 && curdir[i]) { tbuffer[i] = curdir[i]; if ( tbuffer[i] == '\\' || tbuffer[i] == '/') count++; i++; } if (curdir[i] == 0 || (curdir[i-1] != '\\' && curdir[i-1] != '/')) tbuffer[i++] = '\\'; tbuffer[i] = 0; strcat(tbuffer, SMB_IOCTL_FILENAME_NOSLASH); } } } if (!tbuffer[0]) { /* No file name starting with drive colon specified, use UNC name */ sprintf(tbuffer,"\\\\%s\\all%s",netbiosName,SMB_IOCTL_FILENAME); } if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl filename = \"%s\"\r\n", tbuffer); errno = saveerrno; } fflush(stdout); /* * Try to find the correct path and authentication */ dwAttrib = GetFileAttributes(tbuffer); if (dwAttrib == INVALID_FILE_ATTRIBUTES) { int gonext = 0; gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; saveerrno = errno; if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, gle, MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), buf, 4096, NULL ) ) { fprintf(stderr,"pioctl GetFileAttributes(%s) failed: 0x%X\r\n\t[%s]\r\n", tbuffer,gle,buf); } errno = saveerrno; SetLastError(gle); } /* with the redirector interface, fail immediately. there is nothing to retry */ if (usingRDR) return -1; if (!GetEnvironmentVariable("AFS_PIOCTL_SERVER", szClient, sizeof(szClient))) lana_GetNetbiosName(szClient, LANA_NETBIOS_NAME_FULL); if (RegOpenKey (HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hk) == 0) { DWORD dwType = REG_SZ; RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize); RegCloseKey (hk); } if ( szUser[0] ) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl Explorer logon user: [%s]\r\n",szUser); errno = saveerrno; } sprintf(szPath, "\\\\%s", szClient); memset (&nr, 0x00, sizeof(NETRESOURCE)); nr.dwType=RESOURCETYPE_DISK; nr.lpLocalName=0; nr.lpRemoteName=szPath; res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } gonext = 1; } sprintf(szPath, "\\\\%s\\all", szClient); res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } gonext = 1; } if (gonext) goto try_lsa_principal; dwAttrib = GetFileAttributes(tbuffer); if (dwAttrib == INVALID_FILE_ATTRIBUTES) { gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; saveerrno = errno; if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, gle, MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), buf, 4096, NULL ) ) { fprintf(stderr,"pioctl GetFileAttributes(%s) failed: 0x%X\r\n\t[%s]\r\n", tbuffer,gle,buf); } errno = saveerrno; SetLastError(gle); } } } } try_lsa_principal: if (!usingRDR && dwAttrib == INVALID_FILE_ATTRIBUTES) { int gonext = 0; dwSize = sizeof(szUser); if (GetLSAPrincipalName(szUser, dwSize)) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl LSA Principal logon user: [%s]\r\n",szUser); errno = saveerrno; } sprintf(szPath, "\\\\%s", szClient); memset (&nr, 0x00, sizeof(NETRESOURCE)); nr.dwType=RESOURCETYPE_DISK; nr.lpLocalName=0; nr.lpRemoteName=szPath; res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } gonext = 1; } sprintf(szPath, "\\\\%s\\all", szClient); res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } gonext = 1; } if (gonext) goto try_sam_compat; dwAttrib = GetFileAttributes(tbuffer); if (dwAttrib == INVALID_FILE_ATTRIBUTES) { gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; saveerrno = errno; if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, gle, MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), buf, 4096, NULL ) ) { fprintf(stderr,"pioctl GetFileAttributes(%s) failed: 0x%X\r\n\t[%s]\r\n", tbuffer,gle,buf); } errno = saveerrno; SetLastError(gle); } } } } try_sam_compat: if (!usingRDR && dwAttrib == INVALID_FILE_ATTRIBUTES) { dwSize = sizeof(szUser); if (GetUserNameEx(NameSamCompatible, szUser, &dwSize)) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl SamCompatible logon user: [%s]\r\n",szUser); errno = saveerrno; } sprintf(szPath, "\\\\%s", szClient); memset (&nr, 0x00, sizeof(NETRESOURCE)); nr.dwType=RESOURCETYPE_DISK; nr.lpLocalName=0; nr.lpRemoteName=szPath; res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } } sprintf(szPath, "\\\\%s\\all", szClient); res = WNetAddConnection2(&nr,NULL,szUser,0); if (res) { if ( ioctlDebug ) { saveerrno = errno; fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", szPath,szUser,res); errno = saveerrno; } return -1; } dwAttrib = GetFileAttributes(tbuffer); if (dwAttrib == INVALID_FILE_ATTRIBUTES) { gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; saveerrno = errno; if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, gle, MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), buf, 4096, NULL ) ) { fprintf(stderr,"pioctl GetFileAttributes(%s) failed: 0x%X\r\n\t[%s]\r\n", tbuffer,gle,buf); } errno = saveerrno; } return -1; } } else { fprintf(stderr, "GetUserNameEx(NameSamCompatible) failed: 0x%X\r\n", GetLastError()); return -1; } } if ( dwAttrib != (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { fprintf(stderr, "GetFileAttributes(%s) returned: 0x%08X\r\n", tbuffer, dwAttrib); return -1; } /* tbuffer now contains the correct path; now open the file */ sharingViolation = 0; do { if (sharingViolation) Sleep(100); fh = CreateFile(tbuffer, FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); sharingViolation++; } while (fh == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION && sharingViolation < 100); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) return -1; /* return fh and success code */ *handlep = fh; return 0; }
VOID AFS_Logon_Event( PWLX_NOTIFICATION_INFO pInfo ) { TCHAR profileDir[1024] = TEXT(""); DWORD len = 1024; PTOKEN_USER tokenUser = NULL; DWORD retLen; WCHAR szUserW[128] = L""; char szUserA[128] = ""; char szClient[MAX_PATH]; char szPath[MAX_PATH] = ""; NETRESOURCE nr; DWORD res; DWORD dwSize; LogonOptions_t opt; /* Make sure the AFS Libraries are initialized */ AfsLogonInit(); DebugEvent0("AFS_Logon_Event - Start"); DebugEvent("AFS_Logon_Event Process ID: %d",GetCurrentProcessId()); memset(&opt, 0, sizeof(LogonOptions_t)); if (pInfo->UserName && pInfo->Domain) { char username[MAX_USERNAME_LENGTH] = ""; char domain[MAX_DOMAIN_LENGTH] = ""; size_t szlen = 0; DebugEvent0("AFS_Logon_Event - pInfo UserName and Domain"); StringCchLengthW(pInfo->UserName, MAX_USERNAME_LENGTH, &szlen); WideCharToMultiByte(CP_UTF8, 0, pInfo->UserName, szlen, username, sizeof(username), NULL, NULL); StringCchLengthW(pInfo->Domain, MAX_DOMAIN_LENGTH, &szlen); WideCharToMultiByte(CP_UTF8, 0, pInfo->Domain, szlen, domain, sizeof(domain), NULL, NULL); DebugEvent0("AFS_Logon_Event - Calling GetDomainLogonOptions"); GetDomainLogonOptions(NULL, username, domain, &opt); } else { if (!pInfo->UserName) DebugEvent0("AFS_Logon_Event - No pInfo->UserName"); if (!pInfo->Domain) DebugEvent0("AFS_Logon_Event - No pInfo->Domain"); } DebugEvent("AFS_Logon_Event - opt.LogonOption = %lX opt.flags = %lX", opt.LogonOption, opt.flags); if (!ISLOGONINTEGRATED(opt.LogonOption) || !ISREMOTE(opt.flags)) { DebugEvent0("AFS_Logon_Event - Logon is not integrated or not remote"); goto done_logon_event; } DebugEvent0("AFS_Logon_Event - Calling GetTokenInformation"); if (!GetTokenInformation(pInfo->hToken, TokenUser, NULL, 0, &retLen)) { if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { tokenUser = (PTOKEN_USER) LocalAlloc(LPTR, retLen); if (!GetTokenInformation(pInfo->hToken, TokenUser, tokenUser, retLen, &retLen)) { DebugEvent("AFS_Logon_Event - GetTokenInformation failed: GLE = %lX", GetLastError()); } } } /* We can't use pInfo->Domain for the domain since in the cross realm case * this is source domain and not the destination domain. */ if (tokenUser && QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) { WCHAR Domain[64]=L""; GetLocalShortDomain(Domain, sizeof(Domain)); if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) { if (NetUserGetProfilePath(pInfo->Domain, pInfo->UserName, profileDir, len)) GetUserProfileDirectory(pInfo->hToken, profileDir, &len); } } if (strlen(profileDir)) { DebugEvent("AFS_Logon_Event - Profile Directory: %s", profileDir); } else { DebugEvent0("AFS_Logon_Event - Unable to load profile"); } done_logon_event: dwSize = sizeof(szUserA); if (!KFW_AFS_get_lsa_principal(szUserA, &dwSize)) { StringCbPrintfW(szUserW, sizeof(szUserW), L"%s\\%s", pInfo->Domain, pInfo->UserName); WideCharToMultiByte(CP_ACP, 0, szUserW, -1, szUserA, MAX_PATH, NULL, NULL); } if (szUserA[0]) { lana_GetNetbiosName(szClient, LANA_NETBIOS_NAME_FULL); StringCbPrintf(szPath, sizeof(szPath), "\\\\%s", szClient); DebugEvent("AFS_Logon_Event - Logon Name: %s", szUserA); memset (&nr, 0x00, sizeof(NETRESOURCE)); nr.dwType=RESOURCETYPE_DISK; nr.lpLocalName=0; nr.lpRemoteName=szPath; res = WNetAddConnection2(&nr,NULL,szUserA,0); if (res) DebugEvent("AFS_Logon_Event - WNetAddConnection2(%s,%s) failed: 0x%X", szPath, szUserA,res); else DebugEvent0("AFS_Logon_Event - WNetAddConnection2() succeeded"); } else DebugEvent("AFS_Logon_Event - User name conversion failed: GLE = 0x%X",GetLastError()); if ( tokenUser ) LocalFree(tokenUser); DebugEvent0("AFS_Logon_Event - End"); }