int GetFileOwner (const char *Computer, const char *Name, char *Owner) { SECURITY_INFORMATION si = OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION; SECURITY_DESCRIPTOR *sd; char sddata[500]; *Owner=0; sd=(SECURITY_DESCRIPTOR *)sddata; char AnsiName[NM]; OemToChar(Name,AnsiName); SetFileApisToANSI(); DWORD Needed; int GetCode=GetFileSecurity(AnsiName,si,sd,sizeof(sddata),&Needed); SetFileApisToOEM(); if (!GetCode || (Needed>sizeof(sddata))) return(FALSE); PSID pOwner; BOOL OwnerDefaulted; if (!GetSecurityDescriptorOwner(sd,&pOwner,&OwnerDefaulted)) return(FALSE); char AccountName[200],DomainName[200]; DWORD AccountLength=sizeof(AccountName),DomainLength=sizeof(DomainName); SID_NAME_USE snu; if (!LookupAccountSid(Computer,pOwner,AccountName,&AccountLength,DomainName,&DomainLength,&snu)) return(FALSE); CharToOem(AccountName,Owner); return(TRUE); }
void ConvertNameToShort(const char *Src,char *Dest) { char ShortName[NM],AnsiName[NM]; SetFileApisToANSI(); OemToChar(Src,AnsiName); if (GetShortPathName(AnsiName,ShortName,sizeof(ShortName))) CharToOem(ShortName,Dest); else lstrcpy(Dest,Src); SetFileApisToOEM(); }
// 최초 한번만 실행 void zmodifyer::init() { static bool first = true; if( !first ) return; first = false; //g_StdOut.SetStream( NULL ); #if defined(_WIN32) && !defined(UNDER_CE) SetFileApisToOEM(); // ?? #endif }
void TThreads::resume() { if (!inited) { SetFileApisToOEM(); chandle[cnInput] = GetStdHandle(STD_INPUT_HANDLE); chandle[cnOutput] = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleCursorInfo(chandle[cnOutput], &crInfo); GetConsoleScreenBufferInfo(chandle[cnOutput], &sbInfo); GetConsoleMode(chandle[cnInput],&consoleMode); consoleMode &= ~(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_WINDOW_INPUT); SetConsoleMode(chandle[cnInput],consoleMode); evpending = 0; inited = 1; } }
bool WcxArchive::pExtract( const char *lpDestPath ) { int nProcessed = 0; int nResult = 0; m_files.clear(); while ( nResult == 0 ) { tHeaderData HeaderData; memset (&HeaderData, 0, sizeof (HeaderData)); nResult = m_pModule->m_pfnReadHeader (m_hArchive, &HeaderData); if( nResult!=0 ) continue; char szDestPath[MAX_PATH] = {0}; strcpy(szDestPath, lpDestPath); PathAppendA(szDestPath, HeaderData.FileName); int nProcessResult = 0; if ( (HeaderData.FileAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) { CreateDirEx (szDestPath); nProcessResult = m_pModule->m_pfnProcessFile (m_hArchive, PK_SKIP, NULL, NULL); ATLASSERT(FALSE); } else { CreateDirs( szDestPath ); SetFileApisToANSI(); nProcessResult = m_pModule->m_pfnProcessFile (m_hArchive, PK_EXTRACT, NULL, szDestPath); SetFileApisToOEM(); if(!nProcessResult) m_files.push_back( szDestPath ); } if ( !nProcessResult ) nProcessed++; } return nProcessed!=0; }
bool WcxArchive::pOpenArchive( const char *lpFileName, int nOpMode ) { char szFilename[255] = {0}; strcpy(szFilename, lpFileName); tOpenArchiveData OpenArchiveData = {0}; OpenArchiveData.ArcName = szFilename; OpenArchiveData.OpenMode = (nOpMode == 0)?PK_OM_LIST:PK_OM_EXTRACT; SetFileApisToANSI(); m_hArchive = m_pModule->m_pfnOpenArchive (&OpenArchiveData); SetFileApisToOEM(); if(m_hArchive) { if (m_pModule->m_pfnSetProcessDataProc) m_pModule->m_pfnSetProcessDataProc (m_hArchive, ProcessDataProc); if (m_pModule->m_pfnSetChangeVolProc) m_pModule->m_pfnSetChangeVolProc (m_hArchive, ChangeVolProc); } return m_hArchive!=NULL; }
int main(int argc, char **argv) { struct { DWORD ReparseTag; WORD ReparseDataLength; WORD Reserved; WORD NameOffset; WORD NameLength; WORD DisplayNameOffset; WORD DisplayNameLength; BYTE Data[65536]; } ReparseData = { 0 }; if ((argc < 2) | (argc > 3)) { fputs("Syntax to create a junction point:\r\n" "junc DIRECTORY TARGET\r\n" "Where DIRECTORY is an empty directory on an NTFS volume and TARGET is a native\r\n" "path to a target directory, e.g. \"\\??\\C:\\Windows\", \"\\??\\D:\\\" or\r\n" "\"\\Device\\Harddisk0\\Partition1\". (Quotes are optional unless the path\r\n" "contains spaces.)\r\n" "\n" "Syntax to display where a junction point points:\r\n" "junc JUNCTIONPOINT\r\n" "Where JUNCTIONPOINT is a junction point.\r\n", stderr); return 5; } SetFileApisToOEM(); CharToOem(argv[1], argv[1]); HANDLE h; if (argc == 2) h = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); else { h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if ((h == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_FILE_NOT_FOUND)) { CreateDirectory(argv[1], NULL); h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); } } if (h == INVALID_HANDLE_VALUE) { win_perror(argv[1]); return 1; } DWORD dw; if (argc > 2) { WORD wSize = (MultiByteToWideChar(CP_ACP, 0, argv[2], -1, NULL, 0)-1) << 1; if ((wSize + 6 > sizeof(ReparseData.Data)) | (wSize == 0)) { fprintf(stderr, "Name is too long: '%ws'\n", argv[2]); return 4; } ReparseData.ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; ReparseData.ReparseDataLength = 8 + wSize + 4; ReparseData.NameLength = wSize; ReparseData.DisplayNameOffset = (wSize + 2); MultiByteToWideChar(CP_ACP, 0, argv[2], -1, (LPWSTR)ReparseData.Data, sizeof(ReparseData.Data) - 6); CharToOem(argv[2], argv[2]); if (!DeviceIoControl(h, FSCTL_SET_REPARSE_POINT, &ReparseData, 8 + 8 + wSize + 4, NULL, 0, &dw, NULL)) { switch (GetLastError()) { case ERROR_INVALID_REPARSE_DATA: fprintf(stderr, "Invalid target path: '%s'\n", argv[2]); return 1; case ERROR_INVALID_PARAMETER: fputs("This OS does not support reparse points.\r\n", stderr); break; case ERROR_INVALID_FUNCTION: case ERROR_NOT_A_REPARSE_POINT: fputs("This filesystem does not support reparse points.\r\n", stderr); break; case ERROR_DIRECTORY: case ERROR_DIR_NOT_EMPTY: fputs("Reparse points can only created on empty " "directories.\r\n", stderr); break; default: WErrMsg errmsg; CharToOem(errmsg, errmsg); fprintf(stderr, "Error joining '%s' to '%s'\n" "%u: %s", argv[2], argv[1], GetLastError(), errmsg); } return 1; } return 0; } if (!DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, &ReparseData, sizeof ReparseData, &dw, NULL)) { switch (GetLastError()) { case ERROR_INVALID_REPARSE_DATA: fprintf(stderr, "The reparse data on '%s' is invalid\n", argv[1]); return 1; case ERROR_INVALID_PARAMETER: fputs("This OS does not support reparse points.\r\n", stderr); break; case ERROR_INVALID_FUNCTION: fputs("This filesystem does not support reparse points.\r\n", stderr); break; case ERROR_NOT_A_REPARSE_POINT: case ERROR_DIRECTORY: case ERROR_DIR_NOT_EMPTY: fprintf(stderr, "Not a reparse point: '%s'\n", argv[1]); break; default: WErrMsg errmsg; CharToOem(errmsg, errmsg); fprintf(stderr, "Error getting reparse data from '%s'\n" "%u: %s", argv[2], GetLastError(), errmsg); } return 1; } if (ReparseData.ReparseTag != IO_REPARSE_TAG_MOUNT_POINT) { fputs("This reparse point is not a junction.\r\n", stderr); return 2; } printf("%s -> %*ws\n", argv[1], ReparseData.NameLength >> 1, ReparseData.Data + ReparseData.NameOffset); return 0; }
virtual void Prologue() override { SetFileApisToOEM(); OEMApiCnt++; }
int main (int argc, char *argv[]) #endif { char tmp[128]; #if defined(HAVE_FORK) char **saved_argv; mypid = getpid(); /* save argv as setproctitle() under some systems will change it */ saved_argv = mkargv (argc, argv); configpath = parseargs(argc, saved_argv); #else configpath = parseargs(argc, argv); #endif saved_envp = mkargv (-1, environ); #ifdef WIN32 if (service_flag==w32_installservice && !configpath) Log (0, "%s: invalid command line: config name must be specified", extract_filename(argv[0])); w32Init(); #ifdef BINKD9X { int win9x_rc; win9x_rc = win9x_process(argc, argv); if (win9x_rc != -1) return win9x_rc; } #endif #endif tzset(); if (poll_flag && server_flag) Log (0, "-p and -s cannot be used together"); #if defined(WIN32) && !defined(BINKD9X) if (service_flag!=w32_noservice) if (service(argc, argv, environ) && service_flag!=w32_run_as_service) { Log(0, "Windows NT service error"); } if (tray_flag) do_tray_flag(); else { atexit(UnloadBinkdIcon); LoadBinkdIcon(); } #endif /* No command line options: run both client and server */ if (!client_flag && !server_flag) client_flag = server_flag = 1; InitSem (&hostsem); InitSem (&resolvsem); InitSem (&lsem); InitSem (&blsem); InitSem (&varsem); InitSem (&config_sem); InitEventSem (&eothread); InitEventSem (&wakecmgr); #ifdef OS2 InitSem (&fhsem); #endif /* Init for ftnnode.c */ nodes_init (); if (configpath) { current_config = readcfg (configpath); if (!current_config) Log (0, "error in configuration, aborting"); if (dumpcfg_flag) { debug_readcfg (); exit(0); } InitLog(current_config->loglevel, current_config->conlog, current_config->logpath, current_config->nolog.first); } else if (verbose_flag) { #if defined(WIN32) && defined(BINKD9X) AllocTempConsole(); #endif printf ("Binkd " MYVER " (" __DATE__ " " __TIME__ "%s)\n", get_os_string ()); if (verbose_flag>1) { printf ("Compilation flags: " _DBNKD ".\n"); printf ("Facilities: " #ifndef srv_getaddrinfo "fsp1035 " #endif #ifndef HAVE_GETADDRINFO "rfc2553emu " #else "ipv6 " #endif "\n"); } exit (0); } else if (argc > 1) Log (0, "%s: invalid command line: config name must be specified", extract_filename(argv[0])); else usage (); print_args (tmp, sizeof (tmp), argv + 1); #ifdef WIN32 if (service_flag==w32_run_as_service) Log (4, "BEGIN service '%s', " MYNAME "/" MYVER "%s%s", service_name, get_os_string(), tmp); else Log (4, "BEGIN standalone, " MYNAME "/" MYVER "%s%s", get_os_string(), tmp); #else Log (4, "BEGIN, " MYNAME "/" MYVER "%s%s", get_os_string(), tmp); #endif if (sock_init ()) Log (0, "sock_init: %s", TCPERR ()); bsy_init (); rnd (); initsetproctitle (argc, argv, environ); #ifdef WIN32 SetFileApisToOEM(); #endif /* Set up break handler, set up exit list if needed */ if (!set_break_handlers ()) Log (0, "cannot install break handlers"); #if defined(SIGPIPE) signal(SIGPIPE, SIG_IGN); #endif #if defined(WITH_ZLIB) && defined(ZLIBDL) if (current_config->zlib_dll[0]) { if (!zlib_init(current_config->zlib_dll)) Log (2, "cannot load %s, GZ compression disabled", current_config->zlib_dll); else Log (6, "%s loaded successfully", current_config->zlib_dll); } else Log (current_config->zrules.first ? 3 : 5, "zlib-dll not defined, GZ compression disabled"); #endif #if defined(WITH_BZLIB2) && defined(ZLIBDL) if (current_config->bzlib2_dll[0]) { if (!bzlib2_init(current_config->bzlib2_dll)) Log (2, "cannot load %s, BZ2 compression disabled", current_config->bzlib2_dll); else Log (6, "%s loaded successfully", current_config->bzlib2_dll); } else Log (current_config->zrules.first #ifdef WITH_ZLIB && !zlib_loaded #endif ? 3 : 5, "bzlib2-dll not defined, BZ2 compression disabled"); #endif #ifdef WITH_PERL if (current_config->perl_script[0]) { if (!perl_init(current_config->perl_script, current_config)) { if (current_config->perl_strict) Log (0, "error parsing Perl script %s", current_config->perl_script); } else { perl_on_start(current_config); perl_config_loaded(current_config); } } #endif #ifdef HAVE_FORK signal (SIGCHLD, sighandler); #endif { /* Create polls and release polls list */ struct maskchain *psP; for (psP = psPolls.first; psP; psP = psP->next) poll_node (psP->mask, current_config); simplelist_free(&psPolls.linkpoint, destroy_maskchain); } if (no_flag) Log (0, "Exit on option '-n'"); if (inetd_flag) { FTN_ADDR ftn_addr, *pftn_addr; int tempfd; pftn_addr = NULL; if (remote_node) { if (parse_ftnaddress (remote_node, &ftn_addr, current_config->pDomains.first)) { char szFTNAddr[FTN_ADDR_SZ + 1]; exp_ftnaddress (&ftn_addr, current_config->pAddr, current_config->nAddr, current_config->pDomains.first); pftn_addr = &ftn_addr; ftnaddress_to_str (szFTNAddr, pftn_addr); Log (3, "Session with %s", szFTNAddr); } else Log (1, "`%s' cannot be parsed as a Fido-style address", remote_node); } if (!remote_addr) { char *p = getenv("SSH_CONNECTION"); if (p) { remote_addr = strdup(p); p = strchr(remote_addr, ' '); if (p) *p = '\0'; } } /* not using stdin/stdout itself to avoid possible collisions */ if (inetd_socket_in == -1) inetd_socket_in = dup(fileno(stdin)); if (inetd_socket_out == -1) inetd_socket_out = dup(fileno(stdout)); #ifdef UNIX tempfd = open("/dev/null", O_RDWR); #else tempfd = open("nul", O_RDWR); #endif if (tempfd != -1) { dup2(tempfd, fileno(stdin)); dup2(tempfd, fileno(stdout)); close(tempfd); } protocol (inetd_socket_in, inetd_socket_out, NULL, pftn_addr, remote_addr, current_config); soclose (inetd_socket_out); exit (0); } #ifdef BINKD_DAEMONIZE if (daemon_flag) { if (binkd_daemonize(1) < 0) Log (0, "Cannot daemonize"); else mypid = getpid(); } #endif #if defined(HAVE_FORK) signal (SIGHUP, sighandler); #endif if (client_flag && !server_flag) { clientmgr (0); exit (0); } pidsmgr = (int) getpid (); if (client_flag && (pidcmgr = branch (clientmgr, 0, 0)) < 0) { Log (0, "cannot branch out"); } if (*current_config->pid_file) { if ( unlink (current_config->pid_file) == 0 ) /* successfully unlinked, i.e. an old pid_file was found */ Log (1, "unexpected pid_file: %s: unlinked", current_config->pid_file); else { int current_log_level = 1; switch ( errno ) { case ENOENT : /* file not found or null pathname */ current_log_level = 8; /* it's ok */ break; default : break; } Log (current_log_level, "unlink_pid_file: %s: %s", current_config->pid_file, strerror (errno)); } create_sem_file (current_config->pid_file, 1); } servmgr (); return 0; }
void silly_entry(void *peb) { char * path1=NULL; int rc; char temp[MAX_PATH+5]; char buf[MAX_PATH]; char ptr1[MAX_PATH]; char ptr2[MAX_PATH]; char ptr3[MAX_PATH]; OSVERSIONINFO osver; init_wow64(); // look at the explanation in fork.c for why we do these steps. if (bIsWow64Process) { HANDLE h64Parent,h64Child; char *stk, *end; DWORD mb = (1<<20); // if we found the events, then we're the product of a fork() if (CreateWow64Events(GetCurrentProcessId(), &h64Parent,&h64Child,TRUE)) { if (!h64Parent || !h64Child) return; // tell parent we're rolling SetEvent(h64Child); if(WaitForSingleObject(h64Parent,FORK_TIMEOUT) != WAIT_OBJECT_0) { return; } // if __forked is 0, we shouldn't have found the events if (!__forked) return; } // now create the stack if (!__forked) { stk = VirtualAlloc(NULL,mb+65536,MEM_COMMIT,PAGE_READWRITE); if (!stk) { dprintf("virtual alloc in parent failed %d\n",GetLastError()); return; } end = stk + mb + 65536; end -= sizeof(char*); __fork_stack_begin = end; __asm {mov esp,end }; set_stackbase(end); heap_init(); } else { // child process stk = (char*)__fork_stack_begin + sizeof(char*)- mb - 65536; dprintf("begin is 0x%08x\n",stk); end = VirtualAlloc(stk, mb+65536 , MEM_RESERVE , PAGE_READWRITE); if (!end) { rc = GetLastError(); dprintf("virtual alloc 1 in child failed %d\n",rc); return; } stk = VirtualAlloc(end, mb+65536 , MEM_COMMIT , PAGE_READWRITE); if (!stk) { rc = GetLastError(); dprintf("virtual alloc 2 in child failed %d\n",rc); return; } end = stk + mb + 65536; __asm {mov esp, end}; set_stackbase(end); SetEvent(h64Child); CloseHandle(h64Parent); CloseHandle(h64Child); } } SetFileApisToOEM(); if (!bIsWow64Process) heap_init(); osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx(&osver)) { MessageBox(NULL,"GetVersionEx failed","tcsh",MB_ICONHAND); ExitProcess(0xFF); } gdwVersion = osver.dwMajorVersion; /* If home is set, we only need to change '\' to '/' */ rc = GetEnvironmentVariable("HOME",buf,MAX_PATH); if (rc && (rc < MAX_PATH)){ path_slashify(buf); (void)SetEnvironmentVariable("HOME",buf); goto skippy; } memset(ptr1,0,MAX_PATH); memset(ptr2,0,MAX_PATH); memset(ptr3,0,MAX_PATH); if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT) { GetEnvironmentVariable("USERPROFILE",ptr1,MAX_PATH); GetEnvironmentVariable("HOMEDRIVE",ptr2,MAX_PATH); GetEnvironmentVariable("HOMEPATH",ptr3,MAX_PATH); ptr1[MAX_PATH -1] = ptr2[MAX_PATH-1] = ptr3[MAX_PATH-1]= 0; if (!ptr1[0] || osver.dwMajorVersion <4) { wsprintf(temp,"%s%s",ptr2[0]?ptr2:"C:",ptr3[0]?ptr3:"\\"); } else if (osver.dwMajorVersion >= 4) { wsprintf(temp,"%s",ptr1); } } else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { rc = GetWindowsDirectory(ptr1,MAX_PATH); if (rc > MAX_PATH) { MessageBox(NULL,"This should never happen","tcsh",MB_ICONHAND); ExitProcess(0xFF); } wsprintf(temp,"%s",ptr1); } else { MessageBox(NULL,"Unknown platform","tcsh",MB_ICONHAND); } path_slashify(temp); SetEnvironmentVariable("HOME",temp); skippy: gdwPlatform = osver.dwPlatformId; rc = GetEnvironmentVariable("Path",path1,0); if ( rc !=0) { path1 =heap_alloc(rc); GetEnvironmentVariable("Path",path1,rc); SetEnvironmentVariable("Path",NULL); /*SetEnvironmentVariable("PATH",NULL);*/ SetEnvironmentVariable("PATH",path1); heap_free(path1); } mainCRTStartup(peb); }