int statcom_main(uint16_t server_port, uint16_t max_clients, char* module_name, int (*call_command_handler_function) (SSL *, int)) { int setupdone=0, connection_id, connectSocket; pid_t pid; /*SSL specific.*/ SSL *ssl; SSL_CTX *ctx; total_clients = 0; ctx = initialize_SSL(server_port, max_clients, module_name); while(1) /*while loop to serve many connections. When one connection arrives, a new process is forked to handle it.*/ { /*and the parent process comes here again to continue listening.*/ if((connectSocket = create_socket_connect_verify(server_port, max_clients, module_name, setupdone, &connection_id)) == ERROR) goto error; switch(pid = fork()) /* here a new child process is created and the parent continues.*/ { case -1:/*something went wrong..*/ mysyslog(LOG_ERR, "Error in forking a new %s connection.\nAborting.....\n", module_name); break; case 0:/*child process*/ signal(SIGCHLD,SIG_IGN); /* to keep track of when a child is terminated.*/ signal(SIGCLD,SIG_IGN); /* to keep track of when a child is terminated.*/ if((ssl = do_ssl_handshake(ctx, connectSocket)) != NULL) /* if OK call function to handle engstation comms.*/ call_command_handler_function(ssl, connection_id); /* this function don't return until the station ends the connection.*/ closeconnection(connectSocket, ssl, ctx, module_name); /* we're done handling this connection, the client will exit now.*/ exit(0); /*when finished handling comms, we kill the child.*/ break; default: /*parent process go on. The parent goes back to the begining of the while loop to continue listening.*/ /*the child handles the new connection.*/ setupdone = 1; mysyslog(LOG_INFO, "Parent saving PID=%d of child in slot=%d\n", pid,connection_id ); used_ports[connection_id].childpid = pid; /*save the PID of the child in the used_port table.*/ break; } error: ; /*an empty statmenent is needed by the compiler.*/ } return 0; /*we should never reach here !*/ }
//--------------------------------------------------------------------------------- int HandleCommand(t_connection c[], DWORD dwIndex, t_packet *packet, DWORD dwUserID, int cn) { const int ttype = packet->h.header.type; switch(ttype) { case CMD_NONE : break; case CMD_PING : break; case CMD_LOST_CONNECTION : closeconnection(c, cn, CCT_NORMAL); break; case CMD_IM_GAME_SERVER : break; case CMD_ACCESS_CHAR_DB : // 010613 YGI { const int server_id = packet->u.server_access_char_db.server_id; memcpy(c[cn].id, packet->u.server_access_char_db.id, ID_LENGTH); memcpy(c[cn].name, packet->u.server_access_char_db.name, NM_LENGTH); if(GetCharDB_SQL(c, cn) != 1) break; if(GetCharGameDB_SQL(c, cn) != 1 ) break; LPCHARLIST ch = &c[cn].chrlst; if(!CheckRookieServerAble(ch->Level))//021230 lsw { break; } ch->server_id = cn; // 030923 HK YGI int ret = get_BinaryData_from_Chr_Info( (UCHAR *)ch->Ws, (UCHAR *)ch->Ps, (UCHAR *)ch->Skill, (UCHAR *)ch->skillexp, (UCHAR *)ch->tac_skillEXP, (UCHAR *)var[cn], (UCHAR *)ch->inv, (UCHAR *)ch->equip, (UCHAR *)ch->quick, (UCHAR *)ch->party, (UCHAR *)ch->relation, (UCHAR *)ch->employment, (UCHAR *)ch->Item, c[cn].id, c[cn].name ) ; if( ret != 1 ) break; ret = get_BinaryData_from_Chr_Info2 ( (UCHAR *)c[cn].chrlst.bank, c[cn].id, c[cn].name ) ; if( ret != 1 ) break; ///////////////////////////// ResetCharInfo(var[cn], ch); // PutEventItem( 2, &c[cn] ); // 이벤트용 아이템 넣어 주기 // BBD 040308 Map서버가 주기로 했음 int refresh_inventory = CheckEventITem( ch ); CheckEventJoin(&c[cn].chrlst); // 020115 LTS ///////////////////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_CHAR_DB; packet->h.header.size = sizeof(t_server_accept_char_db); t_server_accept_char_db *tp = &(packet->u.server_accept_char_db); strcpy( tp->name, c[cn].name );// 030923 HK YGI tp->server_id = server_id; tp->Level = ch->Level; tp->Exp = ch->Exp; tp->Gender = ch->Gender; tp->Face = ch->Face; tp->nGuildCode = ch->nGuildCode; // CSD-030324 tp->Class = ch->Class; tp->Spell = ch->Spell; tp->Job = ch->Job; // 0212 YGI tp->Str = ch->Str; tp->Con = ch->Con; tp->Dex = ch->Dex; tp->Wis = ch->Wis; tp->Int = ch->Int; tp->MoveP = ch->MoveP; tp->Char = ch->Char; tp->Endu = ch->Endu; tp->Moral = ch->Moral; tp->Money = ch->Money; tp->nLife = ch->Hp; tp->nMaxHp = ch->HpMax; tp->nMana = ch->Mana; tp->nMaxMp = ch->ManaMax; tp->nHungry = ch->Hungry; tp->nMaxHungry = ch->HungryMax; tp->Condition = ch->Condition; tp->SprNo = ch->SprNo; tp->X = ch->X; tp->Y = ch->Y; memcpy( tp->MapName, ch->MapName, 20); tp->Peacests = ch->Peacests; tp->Sight = ch->Sight; tp->BodyR = ch->BodyR; tp->BodyG = ch->BodyG; tp->BodyB = ch->BodyB; tp->ClothR = ch->ClothR; tp->ClothG = ch->ClothG; tp->ClothB = ch->ClothB; tp->Age = ch->Age; tp->Luck = ch->Luck; tp->wsps = ch->wsps; memcpy( &tp->nation, &ch->name_status, sizeof( DWORD ) ); // 1004 YGI tp->accessory[0] = ch->accessory[0]; tp->accessory[1] = ch->accessory[1]; tp->accessory[2] = ch->accessory[2]; tp->accessory[3] = ch->accessory[3]; ch->mantle = ch->equip[ WT_NECK].item_no; tp->mantle = ch->mantle; tp->bAlive = ch->bAlive; tp->openhouse = ch->openhouse; tp->disease[0] = ch->disease[0]; tp->disease[1] = ch->disease[1]; tp->disease[2] = ch->disease[2]; tp->disease[3] = ch->disease[3]; tp->disease[4] = ch->disease[4]; tp->disease[5] = ch->disease[5]; tp->total_id = ch->total_id; tp->nPoison = ch->nPoison; tp->nCurse = ch->nCurse; tp->nFire = ch->nFire; tp->nIce = ch->nIce; tp->nElect = ch->nElect; tp->nHoly = ch->nHoly; tp->viewtype = ch->viewtype; // 0212 YGI tp->social_status = ch->social_status; tp->fame = ch->fame; tp->fame_pk = ch->fame_pk; // 010915 LTS //Fame_PK -> NWCharacter로 교체 DB에는 실제로 NWCharacter의 값이 들어갑니다. tp->NWCharacter = ch->NWCharacter; // 010915 LTS tp->EventJoin = ch->EventJoin; // 020115 LTS tp->nUserAge = GetUserAge(c[cn].id); // 030929 kyo memcpy(tp->aStepInfo, ch->aStepInfo, sizeof(ch->aStepInfo)); if(!QueuePacket(c, cn, packet, 1)){break;} ///////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); t_server_accept_char_game_db *tsac = &(packet->u.server_accept_char_game_db); packet->h.header.type = CMD_ACCEPT_CHAR_GAME_DB; packet->h.header.size = sizeof(t_server_accept_char_game_db); strcpy( tsac->name, c[cn].name );// 030923 HK YGI tsac->server_id = server_id; tsac->BankMoney = ch->BankMoney; memcpy( &tsac->win_defeat, &ch->WinLoseScore, sizeof( DWORD ) ); tsac->LadderScore = ch->LadderScore; tsac->LastLoan = ch->LastLoan; tsac->nk3 = ch->nk[N_VYSEUS]; tsac->nk4 = ch->nk[N_ZYPERN]; tsac->nk6 = ch->nk[N_YILSE]; tsac->killmon = ch->killmon; tsac->killanimal = ch->killanimal; tsac->killpc = ch->killpc; tsac->reserved_point= ch->reserved_point; tsac->Tactics = ch->Tactics; if(!QueuePacket(c, cn, packet, 1)) break; /////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_BINARY_DATA; packet->h.header.size = sizeof(t_server_accept_binary_data); packet->u.server_accept_binary_data.server_id = server_id; strcpy( packet->u.server_accept_binary_data.name, c[cn].name );// 030923 HK YGI memcpy((UCHAR *)packet->u.server_accept_binary_data.Ws, (UCHAR *)ch->Ws, SIZE_OF_WS); memcpy((UCHAR *)packet->u.server_accept_binary_data.Ps, (UCHAR *)ch->Ps, SIZE_OF_PS); memcpy((UCHAR *)packet->u.server_accept_binary_data.Skill, (UCHAR *)ch->Skill, SIZE_OF_SKILL); memcpy((UCHAR *)packet->u.server_accept_binary_data.skillexp, (UCHAR *)ch->skillexp, SIZE_OF_SKILL_EXP); memcpy((UCHAR *)packet->u.server_accept_binary_data.tac_skillEXP, (UCHAR *)ch->tac_skillEXP, SIZE_OF_TAC_SKILL_EXP); memcpy((UCHAR *)packet->u.server_accept_binary_data.equip, (UCHAR *)ch->equip, SIZE_OF_EQUIP); memcpy((UCHAR *)packet->u.server_accept_binary_data.quick, (UCHAR *)ch->quick, SIZE_OF_QUICK); memcpy((UCHAR *)packet->u.server_accept_binary_data.party, (UCHAR *)ch->party, SIZE_OF_PARTY); memcpy((UCHAR *)packet->u.server_accept_binary_data.relation, (UCHAR *)ch->relation, SIZE_OF_RELATION); memcpy((UCHAR *)packet->u.server_accept_binary_data.employment, (UCHAR *)ch->employment, SIZE_OF_EMPLOYMENT); if(!QueuePacket(c, cn, packet, 1)) break; /////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_SCRIPT_DATA; packet->h.header.size = sizeof(t_server_accept_script_data); packet->u.server_accept_script_data.server_id = server_id; strcpy( packet->u.server_accept_script_data.name, c[cn].name );// 030923 HK YGI memcpy((UCHAR *)packet->u.server_accept_script_data.script_var, (UCHAR *)var[cn], SIZE_OF_SCRIPT_VAR); if(!QueuePacket(c, cn, packet, 1)) break; /////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_INV_DATA; packet->h.header.size = sizeof(t_server_accept_inv_data); packet->u.server_accept_inv_data.server_id = server_id; strcpy( packet->u.server_accept_inv_data.name, c[cn].name );// 030923 HK YGI memcpy((UCHAR *)packet->u.server_accept_inv_data.inv, (UCHAR *)ch->inv, SIZE_OF_INV); //021030 YGI packet->u.server_accept_inv_data.refresh_inventory = refresh_inventory; if(!QueuePacket(c, cn, packet, 1)) break; /////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_ITEM_DATA; packet->h.header.size = sizeof(t_server_accept_item_data); packet->u.server_accept_item_data.server_id = server_id; strcpy( packet->u.server_accept_item_data.name, c[cn].name );// 030923 HK YGI memcpy((UCHAR *)packet->u.server_accept_item_data.Item, (UCHAR *)c[cn].chrlst.Item, SIZE_OF_ITEMINDEX); if(!QueuePacket(c, cn, packet, 1)) break; /////////////////////////////////////////////////////////////////////// memset(packet, 0, sizeof(t_packet)); packet->h.header.type = CMD_ACCEPT_BANKITEM_DATA; packet->h.header.size = sizeof(t_server_accept_bankitem_data); packet->u.server_accept_bankitem_data.server_id = server_id; strcpy( packet->u.server_accept_bankitem_data.name, c[cn].name );// 030923 HK YGI memcpy((UCHAR *)packet->u.server_accept_bankitem_data.bankitem, (UCHAR *)c[cn].chrlst.bank, SIZE_OF_BANKITEM); if(!QueuePacket(c, cn, packet, 1)) break; }break; case CMD_ACCESS_LOGIN : { ::CheckIDAutherizing(*packet,cn); }break; case CMD_PARTY_ACCESS : { ::SendPartyInforForGameserver( packet->u.kein.server_req_party_db.server_id, packet->u.kein.server_req_party_db.ct, packet->u.kein.server_req_party_db.name, c, cn ); }break; case CMD_REQ_PARTY_TOGETHER : { ::SendPartyInfoOfOtherCharToGameserver( packet->u.kein.server_req_party_together.party_name, packet->u.kein.server_req_party_together.my_name, packet->u.kein.server_req_party_together.server_id, c, cn ); }break; case CMD_CONNECT_INFO : // 4개중의 하나의 캐릭터를 선택했다 { // 캐릭터초기화이후실행 0405 KHS // 0405 YGI new char int is_new_char = 0; if( ::GetCharNew(is_new_char, packet->u.client_connect_info.name ) ) // 4월 1일 새롭게 만든 캐릭터 인가? { if( is_new_char ) { break; }// 1: 예전 캐릭터 0: 새로운 캐릭터 } else { break; } if( !CheckIsRealName( connections[cn].id, packet->u.client_connect_info.name ) ) { break; } // 010301 khs probide to hacking.. memset(c[cn].name, 0, NM_LENGTH); strcpy(c[cn].name, packet->u.client_connect_info.name); StartMap = packet->u.client_connect_info.startmap; StartPosition = packet->u.client_connect_info.startposition; if( StartMap < 0 || StartMap > 1 ) StartMap = 0; if( StartPosition == 99 ) { } else if( StartPosition < 1 || StartPosition > 20 ) { StartPosition = 1; } c[cn].chrlst.startmap = StartMap; c[cn].chrlst.startposition = StartPosition; memset(packet, 0, sizeof(t_packet)); int ret = GetCharDB_SQL(c, cn); if( ret ) { CheckStartMap( c, cn, StartPosition ); // 1004 YGI ret = GetCharGameDB_SQL(c,cn); } if( c[cn].chrlst.Hp == 0 ) { c[cn].chrlst.bAlive = DEAD_; c[cn].chrlst.Condition = CON_DEATH; c[cn].chrlst.viewtype = VIEWTYPE_GHOST_; } else { c[cn].chrlst.bAlive = ALIVE_; c[cn].chrlst.Condition = CON_NORMAL; c[cn].chrlst.viewtype = VIEWTYPE_NORMAL_; } if( c[cn].chrlst.startposition != 99 ) // 원래의 위치에 들어간다. { strcpy( c[cn].mapname, StartMapPosition[ StartMap][ StartPosition ] ); strcpy( c[cn].chrlst.MapName, StartMapPosition[ StartMap][ StartPosition ] ); } if(ret == 1) { //< CSD-030324 extern void CheckNewGuildCode( CHARLIST *ch ); CheckNewGuildCode( &c[cn].chrlst ); //> CSD-030324 packet->h.header.type = CMD_USER_DB; { PutPacketCharDB( c, cn, packet ); } packet->h.header.size = sizeof(t_server_user_db_data); if(!QueuePacket(c, cn, packet, 1)) break; } else // Invalid DB { ::MyLog(1, "Invalid DB [%s]", c[cn].name); packet->h.header.type = CMD_INVALID_DB; packet->h.header.size = 0; QueuePacket(c, cn, packet, 1); break; } break; } case CMD_CHR_ITEM_INFO_0 : { //------------------------------------------------------------ // Send Char Binary Data //------------------------------------------------------------ get_BinaryData_from_Chr_Info( (UCHAR *)c[cn].chrlst.Ws, (UCHAR *)c[cn].chrlst.Ps, (UCHAR *)c[cn].chrlst.Skill, (UCHAR *)c[cn].chrlst.skillexp, (UCHAR *)c[cn].chrlst.tac_skillEXP, (UCHAR *)var[c[cn].chrlst.server_id], (UCHAR *)c[cn].chrlst.inv, (UCHAR *)c[cn].chrlst.equip, (UCHAR *)c[cn].chrlst.quick, (UCHAR *)c[cn].chrlst.party, (UCHAR *)c[cn].chrlst.relation, (UCHAR *)c[cn].chrlst.employment, (UCHAR *)c[cn].chrlst.Item, c[cn].id, c[cn].name ) ; // PutEventItem( 1, &c[cn] ); // 이벤트용 아이템 넣어 주기 // BBD 040308 Map서버가 주기로 했음 SendItemQuick( c, cn ); // 마법을 배우지 않고 모든 마법을 사용하려면 이곳에서 Ws/Ps를 Setting해주면 된다. for( int i = 0 ; i < 1000 ; i ++) { if( c[cn].chrlst.Item[i] == 0) break; } c[cn].chrlst.ItemMax = i; SendLearnedItem( c, cn ); // 0730 YGI break; } case CMD_CHR_ITEM_INFO_1 : SendItemEquip( c, cn ); break; case CMD_CHR_ITEM_INFO_2 : SendItemInventory( packet->u.client_item_inv.count, c, cn ); break; case CMD_CHAR_INFO_MAGIC : SendCharInfoMagic( c, cn ); break; case CMD_CHAR_INFO_SKILL : { SendCharInfoSkill( c, cn ); ::MyLog(0, "Send [%s]Info to [%s]", c[cn].name, c[cn].id); }break; case CMD_CHAR_INFO_TAC_SKILL_EXP : SendCharInfotac_skillEXP( c, cn ); break; case CMD_CONNECT_INFO1 : { char *map_name = 0; int ret = 0; if( c[cn].chrlst.startposition == 99 ) { ret = GetMapName_SQL( c, cn); // 001126 KHS if( ret == 1 ) map_name = c[cn].mapname; } else { map_name = StartMapPosition[ c[cn].chrlst.startmap][c[cn].chrlst.startposition]; } if( map_name ) { ret = 0; int port = MapPort( map_name ); if( port ) { ret = 1; packet->u.kein.server_connect_info_kein.data1.port = port; ret += CheckEventObject( map_name, &packet->u.kein.server_connect_info_kein.u.data3); ret += CheckEventSound( map_name, &packet->u.kein.server_connect_info_kein.u.data3); } } if( ret ) { //----------------------------------------------------------------- //----------------------------------------------------------------- packet->h.header.type = CMD_CONNECT_INFO; packet->h.header.size = sizeof(t_server_connect_info); if( ret == 4 ) // object + sound { packet->h.header.size += sizeof(k_event_object_sound); } else if( ret == 3 ) // sound { packet->h.header.size += sizeof(k_event_sound); int sound_no = packet->u.kein.server_connect_info_kein.u.data3.sound_no; packet->u.kein.server_connect_info_kein.u.data4.sound_no = sound_no; } else if( ret == 2 ) // object { packet->h.header.size += sizeof(k_event_object); } packet->u.server_connect_info.startposition = c[cn].chrlst.startposition; if(!QueuePacket(c, cn, packet, 1)) { break; } //----------------------------------------------------------------- c[cn].state = CONNECT_JOIN; } else // Invalid DB { ::MyLog(0, "Invalid User DB [%s]", c[cn].name); packet->h.header.type = CMD_INVALID_DB; packet->h.header.size = 0; QueuePacket(c, cn, packet, 1); break; } break; } case CMD_CREATE_CHAR : { int ret = CreateChar_SQL(c, cn, packet); if(ret == 1) { packet->h.header.type = CMD_ACCEPT_CREATE; packet->h.header.size = 1; packet->u.data[0]= 0 ; QueuePacket(c, cn, packet, 1); ::MyLog( 0, "%s (ID:%s) is Generated ! IP %s", c[cn].id, c[cn].chrlst.Name, c[cn].ip_address ); break; } else { int is_delete = 1; switch( ret ) { case -100 : ::MyLog( 0, "Fail:Character Generation ( Already character %s, ID:%s :%d)", packet->u.client_create_char.name, c[cn].id, ret ); RecvHackingUser( c[cn].id, packet->u.client_create_char.name, 20009, " ", "Not his Char" ); is_delete = 0; // 지우지 않는다. break; case -30 : ::MyLog( 0, "Fail : Try to make Character but NO ID in chr_log_info ( %s, ID:%s )", packet->u.client_create_char.name, c[cn].id ); break; default : ::MyLog( 0, "Fail : Character Generation( %s, ID:%s :%d)", packet->u.client_create_char.name, c[cn].id, ret ); break; } if(is_delete) { delete_char_create_fail( packet->u.client_create_char.name ); } packet->h.header.type = CMD_INVALID_DB; packet->h.header.size = 1; packet->u.data[0]= 0 ; QueuePacket(c, cn, packet, 1); break; } break; } case CMD_DELETE_CHAR : { const char* szName = packet->u.client_delete_char.szName; int ret = DeleteChar_SQL( c[cn].id, szName ,packet->u.client_delete_char.szSecretKeyCode ); if(ret == 1) { MyLog( LOG_NORMAL, "Success : Character Deleted (%s, ID:%s)", szName, c[cn].id ); RecvHackingUser( c[cn].id, szName, HACKING_DELETE_CHAR_NORMAL_, c[cn].ip_address, "Character Deleted !! Normally.." ); packet->h.header.type = CMD_ACCEPT_DELETE; packet->h.header.size = 1; packet->u.data[0]= 0 ; QueuePacket(c, cn, packet, 1); break; } else { MyLog( LOG_NORMAL, "Delete Fail !"); packet->h.header.type = CMD_INVALID_DB; packet->h.header.size = 1; packet->u.data[0]= 0 ; QueuePacket(c, cn, packet, 1); break; } break; } case CMD_ISTHERE_CHARNAME : RecvIsThereCharName( cn, packet->u.client_isthere_charname.name ); break; case CMD_CHECK_BETA_TEST : CheckBetaIdTest( cn, packet->u.kein.beta_check_id.id ); break; case CMD_SPECIAL_ITEM : RecvUpdateSpecial( &(packet->u.server_special_item) ); break; case CMD_UPDATE_CHAR_DB: { int iRet = RecvUpdateCharDB( &(packet->u.update_char_db) ); if(iRet != 1) { MyLog(0,"RecvUpdateCharDB Failed"); } }break; case CMD_UPDATE_BINARY_DATA0 : { int iRet = RecvUpdateBinaryData( &(packet->u.server_update_binary_data0) ); if(iRet != 1) { MyLog(0,"RecvUpdateBinaryData Failed"); } }break; case CMD_UPDATE_BINARY_DATA1 : { int iRet = RecvUpdateBinaryData1( &(packet->u.server_update_binary_data1) ); if(iRet != 1) { MyLog(0,"RecvUpdateBinaryData1 Failed"); } }break; case CMD_UPDATE_SCRIPT_DATA : { int iRet = RecvUpdateScriptData( &(packet->u.server_update_script_data) ); if(iRet != 1) { MyLog(0,"RecvUpdateScriptData Failed"); } }break; case CMD_UPDATE_INV_DATA : { int iRet = RecvUpdateInvData( &(packet->u.server_update_inv_data) ); if(iRet != 1) { MyLog(0,"RecvUpdateInvData Failed"); } }break; case CMD_UPDATE_ITEM_DATA : { int iRet = RecvUpdateItemData( &(packet->u.server_update_item_data ) ); if(iRet != 1) { MyLog(0,"RecvUpdateItemData Failed"); } }break; case CMD_UPDATE_BANKITEM_DATA : { int iRet = RecvUpdateBankItemData( c, cn, &(packet->u.server_update_bankitem_data)); if(iRet != 1) { MyLog(0,"RecvUpdateBankItemData Failed"); } }break; case CMD_REQ_DELETE_USERID : onepass.DeleteUsedID_SQL_ForPay( packet->u.gs_req_delete_userid.mapname, packet->u.gs_req_delete_userid.id, 0 ); break; case CMD_REQ_INSERT_USERID : { if(!::CheckIsRealName(packet->u.gs_req_insert_userid.id, packet->u.gs_req_insert_userid.name ) ) { break; } t_packet tp; gs_req_insert_userid* pGRIU = &packet->u.gs_req_insert_userid; if( ::UpdateLogintablebyChangeMap( pGRIU->id, pGRIU->mapname )) // LoginTable에 없음.. 즉, 들어갈수 있음.. { tp.h.header.type = CMD_JOINABLE; tp.u.ls_joinable.server_id = packet->u.gs_req_insert_userid.server_id; tp.h.header.size = sizeof( t_ls_joinable ); } else { tp.h.header.type = CMD_UPDATING; tp.u.ls_updating.server_id = packet->u.gs_req_insert_userid.server_id; tp.h.header.size = sizeof( t_ls_updating ); } ::QueuePacket( c, cn, &tp, 1 ); }break; ///////////// network2.h을 위해.. 0224 YGI /////////////// case CMD_CREATE_ABILITY : SendCreateAbility( cn ); break; case CMD_THROW_DICE : SendThrowDice( packet->u.kein.client_throw_dice.type, cn ); break; case CMD_HOW_MANY_IN_MAP : UpdateTotalMapConnections( packet->u.how_many_in_map.map, packet->u.how_many_in_map.how ); break; case CMD_UPDATE_VERY_IMPORTANT_STATUS : RecvUpdateCharacterVeryImportantStatus( &(packet->u.update_very_important_status) ); break; case CMD_UPDATE_VERY_IMPORTANT_TACTICS : RecvUpdateTacticSkillExpData( &(packet->u.update_very_important_tactics )); break; case CMD_ITEM_DURATION_CHANGE : case CMD_TACTICS_PARRYING_EXP : case CMD_REQ_PARTY_MEMBER : case CMD_LEVELUP_POINT : case CMD_DELETE_ITEM : MyLog( LOG_NORMAL, "No Useful Protocol...%d from %d", packet->h.header.type, cn) ; break; case CMD_SEALSTONEFROMKING : RecvSealStoneFromKing( packet->u.sealstone_fromking.nation ); break; case CMD_SEALSTONE_STATUS : RecvSealStoneStatus( packet ); break; case CMD_NATION2NATION_RELATION : RecvNation2NationRelation( cn, &(packet->u.nation2nation_relation) ); break; case CMD_HACKING_USER : { t_hacking_user *tp = &(packet->u.hacking_user ); RecvHackingUser( tp->id, tp->name, tp->type, tp->ip, tp->cause ); } break; case CMD_RARE_ITEM_MAKE_LOG : { RecvRareItemMakeLog( &packet->u.rare_item_make_log ); } break; case CMD_SET_COMMANDER : // 010915 LTS case CMD_SET_WARFIELD_POSSESSION : case CMD_DELETE_EVENT_JOIN : // 020115 LTS case CMD_SAVE_WARNO : // LTS NEW NATIONWAR CheckHandleByNationWar(packet,c,cn); break; //<soto-030504 case CMD_NEW_EVENT: if(LottoDBMgr())LottoDBMgr()->RecvNewEvent(&packet->u.Lotto_Info,cn); break; case CMD_WINNER_CHECK: if(LottoDBMgr())LottoDBMgr()->RecvWinnerCheck(&packet->u.Check_Winner,cn); break; case CMD_DEL_LOTTO_USER: { if (LottoDBMgr()) { LottoDBMgr()->RecvDelUser(&packet->u.Check_Winner, cn); // BBD 040127 인자추가 } break; } case CMD_LOTTERY_INFO: if(LottoDBMgr())LottoDBMgr()->RecvLottery(&packet->u.Lotto_Info,cn); break; case CMD_CHECK_WINNER_MENU: if(LottoDBMgr())LottoDBMgr()->RecvCheckOpenWinnerMenu(&packet->u.Lotto_Winner_Menu,cn); break; //>soto-030504 //<soto-HK case CMD_CAN_BUY: if(LottoDBMgr()) { if(LocalMgr.IsAbleNation(TAIWAN | HONGKONG | CHINA)) { if(GetShopDemon() != NULL) { DebugPrintf("GetShopDemon() Request CMD_CAN_BUY"); GetShopDemon()->RecvCanBuyLotto(&packet->u.Lotto_Buy,cn); } else { DebugPrintf("GetShopDemon() is NULL =====> CMD_CAN_BUY"); } } else { LottoDBMgr()->RecvCanBuyLotto(&packet->u.Lotto_Buy,cn); } } break; case CMD_LOTTO_BUY: if(LottoDBMgr()) { if(LocalMgr.IsAbleNation(TAIWAN | HONGKONG | CHINA)) { if(GetShopDemon() != NULL) { DebugPrintf("GetShopDemon() Request CMD_LOTTO_BUY"); GetShopDemon()->RecvLottoBuy(&packet->u.Lotto_Buy,cn); } else { DebugPrintf("GetShopDemon() is NULL =====> CMD_LOTTO_BUY"); } } else { LottoDBMgr()->RecvLottoBuy(&packet->u.Lotto_Buy); } } else { } break; //>soto-HK //<soto-Lotto추가 case CMD_LOTTO_SEEK: { if(LottoDBMgr()) { LottoDBMgr()->RecvLottoSeek(&packet->u.Lotto_Seek,cn); } } break; //>soto-Lotto추가. default : { // 0308 YGI int msg = CheckHandleByKein( packet, c, cn ); if(msg == 1) { break; } else { if(HandleCommand2(c, dwIndex, packet, dwUserID, cn))//020505 lsw { break; } else { MyLog( LOG_NORMAL, "ERROR : Unknown Protocol(%d) dwIndex:%d, dwUserID:%d, cn:%d ip:%d", packet->h.header.type, dwIndex, dwUserID, cn, c[cn].ip_address ); return msg; } } } } if( debug_SavePacketExeTimeIng() ) { if( ttype != CMD_NONE ) { { DWORD t = ViewCheckRoutine( 9999 ); if( t < 30 ) { Debug( "%2d:%d:%d %20s[%20s] Recv : %5d- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t ); } else if( t < 100 ) { Debug( "%2d:%d:%d %20s[%20s] Recv : %5d--- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t ); } else if( t < 200 ) { Debug( "%2d:%d:%d %20s[%20s] Recv : %5d------ %3d\n", g_hour,g_min,g_sec,c[cn].id, c[cn].name, ttype, t ); } else { Debug( "%2d:%d:%d %20s[%20s] Recv : %5d---------- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t ); } } } } return(1); }
int main(int argc, char *argv[]) { DWORD dw; exit_th =0; if(argc > 1) { if(strcmp(argv[1],"-i")==0 ) Install(); else if(strcmp(argv[1],"-d")==0) Suppression(); else { printf("Mauvaise option\n"); printf("-i : installe le driver qui sera charge au demarrage\n"); printf("-d : desinstalle le driver \n"); } return 1; } //debut du programme printf("Appuyez sur une touche pour initialiser la connexion\n"); system("pause 1 >Nul"); Initialize(); if(connection()) { printf("connexion echouee, appuyez sur une touche pour sortir du programme\n"); system("pause 1>null"); return 1; } SetDebugPrivilege(); printf("Connexion etablie"); pipehandle = CreateNamedPipe("\\\\.\\\\pipe\\framework", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE,2, 2024, 2024, 0, 0); if(pipehandle == INVALID_HANDLE_VALUE) { printf("Error pipehandle\n"); closeconnection(); system("pause"); return 1; } pipehandle_net = CreateNamedPipe("\\\\.\\\\pipe\\frameworkNet", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE,2, 2024, 2024, 0, 0); if(pipehandle == INVALID_HANDLE_VALUE) { printf("Error pipehandle\n"); closeconnection(); system("pause"); return 1; } //Envoie IOCTL pour que le driver place les hooks ainsi que les callback driverhandle = CreateFile("\\\\.\\dkf",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0); if(driverhandle == INVALID_HANDLE_VALUE) { suppression(); printf("Error CreateFile failed \n"); system("pause"); return 2; } else { DeviceIoControl(driverhandle,IOCTL_DKF_START,NULL,0,NULL,0,&dw,0); } printf("Hook et callback ok\n"); // lancement du Threaad th_handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE) ListenDriver,0,0,&dw); th_handle_net = CreateThread(0,0,(LPTHREAD_START_ROUTINE) ListenDriverNet,0,0,&dw); printf("Pressez une touche pour arrêter le programme\n"); system("pause 1>Nul"); exit_th = 1; TerminateThread(th_handle_net,0); TerminateThread(th_handle,0); if(pipehandle) CloseHandle(pipehandle); printf("de-hook \n"); DeviceIoControl(driverhandle,IOCTL_DKF_STOP,NULL,0,NULL,0,&dw,0); printf("Fermeture de la connexion \n"); system("pause 1>Nul"); closeconnection(); return 0; }
void ClientThread::analizeCommand(QByteArray &bytearray){ QString userName; if (bytearray.contains("USER")) { QRegExp rx("^USER\\s(.*)"); rx.indexIn(bytearray); userName = rx.cap(1); mUser = User::getUser(userName); sendString(FTPProtocol::getInstance()->getResponse(331)); return; } if (bytearray.contains("PASS")) { QRegExp rx("^PASS\\s(.*)"); rx.indexIn(bytearray); QString pass = rx.cap(1); if (mUser.isNull()) { sendString(FTPProtocol::getInstance()->getResponse(503,"PASS send before USER")); } else { if (mUser.auth(pass)) { // logged in sendString(FTPProtocol::getInstance()->getResponse(230)); setAuthenticated(true); if (ftpFileSystem != NULL) delete ftpFileSystem; ftpFileSystem = new FtpFileSystem(mUser.getFolder(), mUser.getFileAccess()); } else { // incorrect sendString(FTPProtocol::getInstance()->getResponse(530)); } } return; } if (isAuthenticated()) { // RNFR -> RNTO sequence if (mRenameBeginned){ if (bytearray.contains("RNTO")){ QRegExp rx("^RNTO\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString newName = rx.cap(1); mRenameBeginned = false; if (ftpFileSystem->rename(mRenameOldName, newName)) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } sendString(FTPProtocol::getInstance()->getResponse(503)); return; } if (bytearray.contains("SYST")){ QString syst("Windows Type : L8"); sendString(FTPProtocol::getInstance()->getResponse(215, syst)); return; } if (bytearray.contains("FEAT")){ QString syst("211-Features:\n\rMDTM\n\rREST STREAM\n\rSIZE\n\rMLST type*;size*;modify*;\n\rMLSD\n\rUTF8\n\rCLNT\n\rMFMT\n\r211 End"); sendString(syst); return; } if (bytearray.contains("HELP")){ QString syst("HELP OK"); sendString(FTPProtocol::getInstance()->getResponse(214, syst)); return; } if (bytearray.contains("PWD")){ sendString(FTPProtocol::getInstance()->getResponse(257, toEncoding("\""+ftpFileSystem->getWorkingDirectory()+"\""))); return; } if (bytearray.contains("OPTS")){ QRegExp rx("^OPTS ([\\w\\s]+)"); rx.indexIn(bytearray); QRegExp rx2("^UTF8 (\\w+)"); rx2.indexIn(rx.cap(1)); if (rx2.cap(1) == "ON") { mIsUTF8 = true; } if (rx2.cap(1) == "OFF") { mIsUTF8 = false; } sendString(FTPProtocol::getInstance()->getResponse(200)); return; } if (bytearray.contains("TYPE")){ // set transfer type QRegExp rx("^TYPE (\\w)( (\\w))?"); rx.indexIn(bytearray); qDebug() << "type" << rx.cap(1) << rx.cap(3); mType = rx.cap(1); sendString(FTPProtocol::getInstance()->getResponse(200)); return; if (mType == "I") { sendString(FTPProtocol::getInstance()->getResponse(200)); } else { sendString(FTPProtocol::getInstance()->getResponse(550)); } return; } if (bytearray.contains("PORT")){ mIsActiveMode = true; QRegExp rx("^PORT (\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)"); rx.indexIn(bytearray); int p1,p2; QString buf(rx.cap(5)); bool flag; p1 = rx.cap(5).toInt(&flag); p2 = rx.cap(6).toInt(&flag); QString addr = rx.cap(1)+"."+rx.cap(2)+"."+rx.cap(3)+"."+rx.cap(4); active_addr = addr; active_port = p1*256+p2; sendString(FTPProtocol::getInstance()->getResponse(200, "Port ok")); return; } if (bytearray.contains("LIST")){ sendString(FTPProtocol::getInstance()->getResponse(150)); sendList(); sendString(FTPProtocol::getInstance()->getResponse(226)); return; } if (bytearray.contains("QUIT")){ sendString(FTPProtocol::getInstance()->getResponse(221)); closeconnection(); return; } if (bytearray.contains("CDUP")){ if (ftpFileSystem->cdUp()) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } if (bytearray.contains("CWD")){ QRegExp rx("^CWD\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString subFolder = rx.cap(1); if (ftpFileSystem->changeDir(subFolder)) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } if (bytearray.contains("RETR")){ QRegExp rx("^RETR\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString filename = rx.cap(1); QString fullFileName = ftpFileSystem->getFileRead(filename); if (fullFileName != NULL) { sendString(FTPProtocol::getInstance()->getResponse(150)); sendFile(fullFileName); } else { sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied")); } return; } if (bytearray.contains("STOR")){ QRegExp rx("^STOR\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString filename = rx.cap(1); QString fullFileName = ftpFileSystem->getFileWrite(filename); if (fullFileName != NULL) { sendString(FTPProtocol::getInstance()->getResponse(150)); recvFile(fullFileName); } else { sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied")); } return; } if (bytearray.contains("RMD")){ QRegExp rx("^RMD\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString filename = rx.cap(1); if (ftpFileSystem->removeDir(filename)) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } if (bytearray.contains("DELE")){ QRegExp rx("^DELE\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString filename = rx.cap(1); if (ftpFileSystem->deleteFile(filename)) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } if (bytearray.contains("MKD")){ QRegExp rx("^MKD\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString dirName = rx.cap(1); if (ftpFileSystem->mkDir(dirName)) sendString(FTPProtocol::getInstance()->getResponse(250)); else sendString(FTPProtocol::getInstance()->getResponse(550)); return; } if (bytearray.contains("PASV")){ mIsActiveMode = false; selectPassivePort(); return; } if (bytearray.contains("SIZE")){ QRegExp rx("^SIZE\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString fileName = rx.cap(1); qint64 size; if (ftpFileSystem->getSize(fileName, &size)) { sendString(FTPProtocol::getInstance()->getResponse(250, QString::number(size))); } else { sendString(FTPProtocol::getInstance()->getResponse(550)); } return; } if (bytearray.contains("MDTM")){ QRegExp rx("^MDTM\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); QString fileName = rx.cap(1); QString sdate = ftpFileSystem->getLastModified(fileName); if (sdate != NULL) { sendString(FTPProtocol::getInstance()->getResponse(250, sdate)); } else { sendString(FTPProtocol::getInstance()->getResponse(550)); } return; } if (bytearray.contains("RNFR")){ QRegExp rx("^RNFR\\s(.*)"); rx.indexIn(fromEncoding(bytearray)); mRenameOldName = rx.cap(1); if (ftpFileSystem->exist(mRenameOldName) && ftpFileSystem->isWritable(mRenameOldName)) { sendString(FTPProtocol::getInstance()->getResponse(350)); mRenameBeginned = true; } else sendString(FTPProtocol::getInstance()->getResponse(550, "Permission denied")); return; } sendString(FTPProtocol::getInstance()->getResponse(500)); } else sendString(FTPProtocol::getInstance()->getResponse(530)); }